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语言中的按位运算符
Nov 26 Python
python中的列表推导浅析
Apr 26 Python
浅析Python中的序列化存储的方法
Apr 28 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
numpy求平均值的维度设定的例子
Aug 24 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
学习Python爬虫的几点建议
Aug 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
php 变量定义方法
2009/06/14 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
多广告投放代码 推荐
2006/11/13 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
企划主管岗位职责
2013/12/12 职场文书
幼儿园评语大全
2014/04/17 职场文书
小学生操行评语大全
2014/04/22 职场文书
保护黄河倡议书
2014/05/16 职场文书
部门2014年度工作总结
2014/11/12 职场文书
师德师风个人总结
2015/02/06 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记