Я сжимаю файлы. Для некоторых из них один процесс хорош, но я сжимаю тысячи из них, и это может (и было) занято несколько дней, поэтому я бы хотел ускорить его многопроцессорность. У меня есть read, что я должен избегать одновременного чтения нескольких файлов, и я предполагаю, что я не должен одновременно писать несколько процессов. Это мой текущий метод, который выполняется отдельно:Чтение, сжатие, запись с многопроцессорной обработкой
import tarfile, bz2, os
def compress(folder):
"compresses a folder into a file"
bz_file = bz2.BZ2File(folder+'.tbz', 'w')
with tarfile.open(mode='w', fileobj = bz_file) as tar:
for fn in os.listdir(folder):
read each file in the folder and do some pre processing
that will make the compressed file much smaller than without
tar.addfile(processed file)
bz_file.close()
return
Это занимает папку и сжимает все ее содержимое в один файл. Это упрощает их обработку и более организованность. Если бы я просто бросил это в пул, то у меня было бы несколько процессов чтения и записи сразу, поэтому я хочу этого избежать. Я могу переделать его так, только один процесс читает файлы, но я до сих пор есть несколько из них писать:
import multiprocessing as mp
import tarfile, bz2, os
def compress(file_list):
folder = file_list[0]
bz_file = bz2.BZ2File(folder+'.tbz', 'w')
with tarfile.open(mode='w', fileobj = bz_file) as tar:
for i in file_list[1:]:
preprocess file data
tar.addfile(processed data)
bz_file.close()
return
cpu_count = mp.cpu_count()
p = mp.Pool(cpu_count)
for subfolder in os.listdir(main_folder):
read all files in subfolder into memory, place into file_list
place file_list into fld_list until fld_list contains cpu_count
file lists. then pass to p.map(compress, fld_list)
Это все еще имеет ряд процессов записи сжатых файлов одновременно. Просто рассказ tarfile о том, какое сжатие использовать начинает писать на жесткий диск. Я не могу прочитать все файлы, которые мне нужно сжать в память, так как у меня нет такого количества оперативной памяти, поэтому я также неоднократно перезапускаю Pool.map.
Как я могу читать и записывать файлы в одном процессе, но все они имеют сжатие в нескольких процессах, избегая при этом перезапуска многопроцессорной обработки. Несколько раз?
Вы собираетесь должны смотреть на то, что 'pbzip2' делает и имитировать его. –
использование очереди с многопроцессорной или многопотоковой обработкой. во-первых, один процесс считывает все файлы и помещает их в очередь 1. во-вторых, многопроцессорные процессы получают файлы из очереди 1 и сжимают, а затем помещают результат в очередь 2. наконец, один процесс переходит из очереди 2 и записывает. –