Python多进程分块读取超大文件的方法


Posted in Python onApril 13, 2016

本文实例讲述了Python多进程分块读取超大文件的方法。分享给大家供大家参考,具体如下:

读取超大的文本文件,使用多进程分块读取,将每一块单独输出成文件

# -*- coding: GBK -*-
import urlparse
import datetime
import os
from multiprocessing import Process,Queue,Array,RLock
"""
多进程分块读取文件
"""
WORKERS = 4
BLOCKSIZE = 100000000
FILE_SIZE = 0
def getFilesize(file):
  """
    获取要读取文件的大小
  """
  global FILE_SIZE
  fstream = open(file,'r')
  fstream.seek(0,os.SEEK_END)
  FILE_SIZE = fstream.tell()
  fstream.close()
def process_found(pid,array,file,rlock):
  global FILE_SIZE
  global JOB
  global PREFIX
  """
    进程处理
    Args:
      pid:进程编号
      array:进程间共享队列,用于标记各进程所读的文件块结束位置
      file:所读文件名称
    各个进程先从array中获取当前最大的值为起始位置startpossition
    结束的位置endpossition (startpossition+BLOCKSIZE) if (startpossition+BLOCKSIZE)<FILE_SIZE else FILE_SIZE
    if startpossition==FILE_SIZE则进程结束
    if startpossition==0则从0开始读取
    if startpossition!=0为防止行被block截断的情况,先读一行不处理,从下一行开始正式处理
    if 当前位置 <=endpossition 就readline
    否则越过边界,就从新查找array中的最大值
  """
  fstream = open(file,'r')
  while True:
    rlock.acquire()
    print 'pid%s'%pid,','.join([str(v) for v in array])
    startpossition = max(array)      
    endpossition = array[pid] = (startpossition+BLOCKSIZE) if (startpossition+BLOCKSIZE)<FILE_SIZE else FILE_SIZE
    rlock.release()
    if startpossition == FILE_SIZE:#end of the file
      print 'pid%s end'%(pid)
      break
    elif startpossition !=0:
      fstream.seek(startpossition)
      fstream.readline()
    pos = ss = fstream.tell()
    ostream = open('/data/download/tmp_pid'+str(pid)+'_jobs'+str(endpossition),'w')
    while pos<endpossition:
      #处理line
      line = fstream.readline()
      ostream.write(line)
      pos = fstream.tell()
    print 'pid:%s,startposition:%s,endposition:%s,pos:%s'%(pid,ss,pos,pos)
    ostream.flush()
    ostream.close()
    ee = fstream.tell()
  fstream.close()
def main():
  global FILE_SIZE
  print datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S") 
  file = "/data/pds/download/scmcc_log/tmp_format_2011004.log"
  getFilesize(file)
  print FILE_SIZE
  rlock = RLock()
  array = Array('l',WORKERS,lock=rlock)
  threads=[]
  for i in range(WORKERS):
    p=Process(target=process_found, args=[i,array,file,rlock])
    threads.append(p)
  for i in range(WORKERS):
    threads[i].start()
  for i in range(WORKERS):
    threads[i].join()
  print datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S") 
if __name__ == '__main__':
  main()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
python实现简易云音乐播放器
Jan 04 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
在python里面运用多继承方法详解
Jul 01 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
Python描述符descriptor使用原理解析
Mar 21 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
用python自动生成日历
Apr 24 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 #Python
Python字符串格式化输出方法分析
Apr 13 #Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 #Python
python 实时遍历日志文件
Apr 12 #Python
python字符串连接方法分析
Apr 12 #Python
python去除文件中空格、Tab及回车的方法
Apr 12 #Python
Python脚本实现虾米网签到功能
Apr 12 #Python
You might like
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
Apache设置虚拟WEB
2006/10/09 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
Python运算符重载用法实例分析
2015/06/01 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
python 字典的打印实现
2019/09/26 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
校园奶茶店创业计划书
2014/01/23 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
2014年财务部工作总结
2014/11/11 职场文书
调解书格式范本
2015/05/20 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript