2015-06-25 3 views
1

я пытаюсь сжать вокруг 95 файлов каждый из размера 7 гигов, используя модуль питона многопроцессорной:используя мультипроцессирование сжать большое количество файлов

import os; 
from shutil import copyfileobj; 
import bz2; 
import multiprocessing as mp 
import pprint 
from numpy.core.test_rational import numerator 

''' Input/Output Path ''' 

ipath = 'E:/AutoConfirm/' 
opath = 'E:/compressed-autoconfirm/' 

''' Number of Processes ''' 
num_of_proc = 6 

def compressFile(fileName,chunkSize=100000000): 
    global ipath 
    print 'Started Compressing %s to %s'%(fileName,opath) 
    inp = open(ipath+fileName,'rb') 
    output = bz2.BZ2File(opath+fileName.split('/')[-1].strip('.csv')+'.bz2','wb',compresslevel=9) 
    copyfileobj(inp,output,chunkSize) 
    print 'Finished Compressing %s to %s'%(fileName,opath) 

def process_worker(fileList): 
    for x in fileList: 
     compressFile(x) 

def split_list(tempList): 
    a , reList = 0, [] 
    global num_of_proc 
    for x in range(num_of_proc+1): 
     reList.append([tempList[a:a+len(tempList)/num_of_proc]]) 
     a = a + len(tempList)/num_of_proc 
    return reList 

pool = mp.Pool(processes=num_of_proc) 
''' Prepare a list of all the file names ''' 
tempList = [x for x in os.listdir(ipath)] 

''' Split the list into sub-lists 
    For example : if I have 90 files and I am using 6 processes 
        each of the process will work on 15 files each ''' 

iterList = split_list(tempList) 

''' print iterList >> [ [filename1, filename2] , [filename3,filename4], ... ] '''  


''' Pass the list consisting of sub-lists to pool ''' 
pool.map(process_worker,iterList) 

Приведенный выше код заканчивает создание 90 процессов вместо 6. Может кто-нибудь помогите мне определить дефект в коде.

+0

Вы не должны делать расщепление файлов вручную: просто подайте полный список файлов (90) в многопроцессорный режим и позвольте ему обрабатывать его самостоятельно. Если он правильный, он автоматически ограничится 6 процессами за раз. – Evert

+0

Я пробовал это, но он продолжал создавать новые процессы, и моя система взорвалась. – Siddarth

ответ

2

Многопроцессорная система будет повторно импортировать модуль, так как все будет на верхнем уровне, все снова и снова, и снова, и снова.

Вам нужно поместить код в функцию и вызвать ее.

def main(): 
    ... 

if __name__ == '__main__': 
    main() 
+0

Спасибо @Peter, что сработало. – Siddarth

Смежные вопросы