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抓取网页时字符集转换问题处理方案分享
Jun 19 Python
python函数形参用法实例分析
Aug 04 Python
python3.x上post发送json数据
Mar 04 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
Python3内置模块random随机方法小结
Jul 13 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
Nov 09 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
Matplotlib animation模块实现动态图
Feb 25 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时间戳与日期的转换
2013/06/06 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
PHP多态代码实例
2015/06/26 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
vue自定义树状结构图的实现方法
2020/10/18 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
python绘制多个子图的实例
2019/07/07 Python
对Python函数设计规范详解
2019/07/19 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
社区庆八一活动方案
2014/02/02 职场文书
学习交流会主持词
2014/04/01 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
2016党员入党决心书
2015/09/22 职场文书
调研报告的主要写法
2019/04/18 职场文书
导游词之西安骊山
2019/12/03 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python