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 相关文章推荐
使用python BeautifulSoup库抓取58手机维修信息
Nov 21 Python
Python实现的二维码生成小软件
Jul 11 Python
python获取本机外网ip的方法
Apr 15 Python
python实现识别相似图片小结
Feb 22 Python
python 猴子补丁(monkey patch)
Jun 26 Python
Django密码系统实现过程详解
Jul 19 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
pip安装tensorflow的坑的解决
Apr 19 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
Python __slots__的使用方法
Nov 15 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
浅谈Python数学建模之整数规划
Jun 23 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
如何选购合适的收音机
2021/03/01 无线电
PHP中设置时区方法小结
2012/06/03 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
js数组去重的hash方法
2016/12/22 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python ip正则式
2009/05/07 Python
用python制作游戏外挂
2018/01/04 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
C#面试题
2016/05/06 面试题
致跳高运动员广播稿
2014/01/13 职场文书
服务行业口号
2014/06/11 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
一般党员对照检查材料
2014/09/24 职场文书
法人代表证明书范本
2015/06/18 职场文书
运动员加油词
2015/07/18 职场文书