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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
从零学Python之入门(二)基本数据类型
May 25 Python
Python socket编程实例详解
May 27 Python
python字典DICT类型合并详解
Aug 17 Python
Python探索之创建二叉树
Oct 25 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
Python设计模式之命令模式简单示例
Jan 10 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
利用python开发app实战的方法
Jul 09 Python
详解python中__name__的意义以及作用
Aug 07 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
python实现对变位词的判断方法
Apr 05 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
PHP共享内存用法实例分析
2016/02/12 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
Javascript中的变量使用说明
2010/05/18 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Python中使用支持向量机(SVM)算法
2017/12/26 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
学python需要去培训机构吗
2020/07/01 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
应届生会计求职信
2013/11/11 职场文书
会计专业自我鉴定
2014/02/10 职场文书
汇源肾宝广告词
2014/03/20 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
2015年老干部工作总结
2015/04/23 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis
详解如何使用Nginx解决跨域问题
2022/05/06 Servers