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使用post提交数据到远程url的方法
Apr 29 Python
在Python中使用HTML模版的教程
Apr 29 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
python实现串口自动触发工作的示例
Jul 02 Python
OpenCV 模板匹配
Jul 10 Python
python numpy存取文件的方式
Apr 01 Python
python判断链表是否有环的实例代码
Jan 31 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
Django 如何实现文件上传下载
Apr 08 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 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
python字典get()方法用法分析
2015/04/17 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python线性方程组求解运算示例
2018/01/17 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
Django设置Postgresql的操作
2020/05/14 Python
python小白切忌乱用表达式
2020/05/29 Python
医学院毕业生自荐信
2013/11/08 职场文书
先进工作者获奖感言
2014/02/08 职场文书
班班通项目实施方案
2014/02/25 职场文书
美容院店长岗位职责
2014/04/08 职场文书
大学生创业计划书
2014/08/14 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
工作检讨书大全
2015/01/26 职场文书
聘任书范文大全
2015/09/21 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS