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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
Python删除windows垃圾文件的方法
Jul 14 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
新手必备Python开发环境搭建教程
May 28 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 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
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP7.0版本备注
2015/07/23 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
php DES加密算法实例分析
2019/09/18 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
django 简单实现登录验证给你
2019/11/06 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
浅析matlab中imadjust函数
2020/02/27 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
自荐书模板
2013/12/19 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server