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 05 Python
Python httplib模块使用实例
Apr 11 Python
python实现统计代码行数的方法
May 22 Python
基于Django用户认证系统详解
Feb 21 Python
java判断三位数的实例讲解
Jun 10 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
PyTorch-GPU加速实例
Jun 23 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Django vue前后端分离整合过程解析
Nov 20 Python
python实现监听键盘
Apr 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
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
python绘制简单彩虹图
2018/11/19 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
阿里云:Aliyun.com
2017/02/15 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
大学生自荐书范文
2013/12/10 职场文书
会议邀请函范文
2014/01/09 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
户外亲子活动总结
2015/05/08 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
职位证明模板
2015/06/23 职场文书
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers
如何基于python实现单目三维重建详解
2022/06/25 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle