网络编程
位置:首页>> 网络编程>> Python编程>> Python多进程分块读取超大文件的方法

Python多进程分块读取超大文件的方法

作者:asdfsx  发布时间:2023-12-07 02:19:28 

标签:Python,多进程,读取文件

本文实例讲述了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程序设计有所帮助。

0
投稿

猜你喜欢

  • 下载并选择MySQL的安装包由于MySQL一直在升级,所以当您阅读本文时,或许在其官方网站上已提供了新的正式版供你下载,因此,以下提供的链接
  • 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于
  • 元素浮动导致的问题及解决办法大家都应该很熟悉了,举个简单的例子:<style type="text/css">
  • 今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用u
  • 刚开始进入页面,当滚动向下超过原屏的时候。右侧会出现一个“返回顶部”的按钮。这个按钮会跟这网页一起向上向下,当滚动到顶部的时候。“返回顶部”
  • python使用pyecharts库画地图数据可视化导库中国地图代码结果世界地图代码结果省级地图代码结果地级市地图代码结果导库from py
  • 原文链接:https://vien.tech/article/157前言本文将介绍ubuntu系统下如何定时执行shell脚本、python
  • 一、软件准备:以下均为截止2005-4-20的最新正式版本PHP(5.1.2):http://www.php.netMySQL(5.0.19
  • 本节讲述单选框/下拉菜单/添加文件,综合css,html和JavaScript实现的,具体详情如下所示:单选框:实现的功能是:(类似平时的性
  • 1.1.1 摘要 相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生
  • 我在Web服务器端安装了Web Server IIS4.0、Oracle Net8 for Client,并创建好了和Oracle8数据库的
  • 一、基本用法1.注释Python中,#+语句 即为一条注释,也可以用 ‘'‘注释块 '''#人生苦短,我用P
  • 1. 背景 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了
  • 常见的误解有: 1. 只用 ado.net ,无法进行动态 SQL 拼接。 2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合
  • 应用目标:制作文字特效 应用软件:Dreamweaver MX操作难度:★★☆☆☆我们常用的网页制作工具Dreamweaver MX不仅可以
  • javascript中的数组对象捆绑了强大的方法因此它可以用很简短的代码实现强大的数组操作而这些功能要C或者c++实现的话可能需要花费几倍的
  • 方法一一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大1、设置数
  • 目录一、比较汽车性能二、比较不同城市近期天气状况雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方
  • 本文实例讲述了PHP函数extension_loaded()用法。分享给大家供大家参考。具体分析如下:extension_loaded —
  • 我们现在使用的验证手段都是以验证码为主,让用户根据图片输入验证字符,这种方法的安全度尚可,但会给用户带来一些不便和困扰,比如这个雅虎的验证码
手机版 网络编程 asp之家 www.aspxhome.com