# -*- 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函式建立子程序...