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 str与repr的区别
Mar 23 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
Python中装饰器高级用法详解
Dec 25 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
python flask中动态URL规则详解
Nov 22 Python
Python处理PDF与CDF实例
Feb 26 Python
浅谈Python协程
Jun 17 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
Python实现Hash算法
Mar 18 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 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
第五节 克隆 [5]
2006/10/09 PHP
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php 删除无限级目录与文件代码共享
2008/11/22 PHP
php数组去重的函数代码
2013/02/03 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
jQuery的12招常用技巧分享
2011/08/08 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python中反射和描述器总结
2018/09/23 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
中专生学习生活的自我评价分享
2013/10/27 职场文书
大学生村官演讲稿
2014/04/25 职场文书
机械专业技术员求职信
2014/06/14 职场文书
大学生入党自荐书
2015/03/05 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js