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实现异步回调机制代码分享
Jan 10 Python
python实现比较两段文本不同之处的方法
May 30 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
Python2包含中文报错的解决方法
Jul 09 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
python库matplotlib绘制坐标图
Oct 18 Python
Python decorator拦截器代码实例解析
Apr 04 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
Drupal7中常用的数据库操作实例
2014/03/02 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
python文件和目录操作方法大全(含实例)
2014/03/12 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
销售内勤岗位职责
2015/02/10 职场文书
宇宙与人观后感
2015/06/05 职场文书
校运会宣传稿大全
2015/07/23 职场文书
高中语文教学反思范文
2016/02/16 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang