我正在压缩文件。单进程可以处理其中的一些文件,但是我需要压缩成千上万的文件,这可能需要几天时间,为了加快速度,我想使用多进程。我已经阅读了相关信息,应该避免同时有多个进程读取同一文件,而且我猜测同时写入多个进程也不行。以下是我当前运行的单进程的方法:
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使用哪种压缩方式,它就会开始向硬盘写入数据。由于我没有足够的RAM来读取需要压缩的所有文件,因此也存在重新启动Pool.map多次的问题。
如何在单个进程中读写文件,同时在多个进程中进行压缩,避免多次重新启动multiprocessing.Pool呢?
pbzip2
的功能并模仿它。 - Ignacio Vazquez-Abrams