多程序分塊讀取檔案

2022-07-03 23:54:12 字數 2532 閱讀 4519

# -*- utf-8 -*-

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)

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)

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

#處理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])

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多程序分塊讀取超大檔案的方法

讀取超大的文字檔案,使用多程序分塊讀取,將每一塊單獨輸出成檔案 coding gbk import urlparse import datetime import os from multiprocessing import process,queue,array,rlock 多程序分塊讀取檔案 w...

多程序檔案共享

一種方法是使用檔案鎖,利用fcntl函式對於檔案進行加鎖解鎖操作,以達到互斥訪問的目的,但是在控制時需要注意程序之間的關係,在有多個程序和共享資源時,應注意死鎖的避免。上乙個最開始寫的程式吧,簡單,就是兩個程序互斥訪問檔案。include include include include void r...

多程序檔案拷貝

下面用程式實現這樣的功能 有乙個檔案的內容需要拷貝到另乙個檔案中,以前的做法是用乙個程序來完成,下面要做的是,是兩個程序同時做這件事,乙個程序負責一半,如父程序負責拷貝檔案的前半段,子程序負責拷貝檔案的後半段。下面看一下程式的流程以及需要注意的問題 其中 要注意的是當父程序呼叫fork函式建立子程序...