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的socket编程入门教程
Apr 23 Python
python中Apriori算法实现讲解
Dec 10 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Django密码系统实现过程详解
Jul 19 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
keras 多任务多loss实例
Jun 22 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 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
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php导出生成word的方法
2015/12/25 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
python实现TCP文件传输
2020/03/20 Python
大学系主任推荐信范文
2013/12/24 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
活动倡议书范文
2014/05/13 职场文书
优秀毕业生求职信
2014/06/05 职场文书
意向书范本
2014/07/29 职场文书
小学家长学校培训材料
2014/08/24 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
万里长城导游词
2015/01/30 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
python 学习GCN图卷积神经网络
2022/05/11 Python
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技