gpt4 book ai didi

python - 并行化 IO 密集型 for 循环 : stupid idea?

转载 作者:行者123 更新时间:2023-12-01 05:12:07 37 4
gpt4 key购买 nike

对于某个目录中的每个文件,我需要读取其内容,并根据其内容对该文件执行某些操作。

我想我应该并行化它,以便可以同时处理多个文件。 (我使用了 python joblib。)

但它比顺序实现慢。

是不是因为文件的每次操作都涉及IO,而IO不能并行?那么并行化并没有加速,并且由于在所有 fork 进程之间切换而导致速度减慢?

<小时/>

更多详细信息:

227,732 个文件(全部为 .dat,<100 kB)。
1 个四核 CPU。
乌类图13.04。

连续耗时:9 秒。
并行所需时间:64 秒。

from joblib import Parallel, delayed

def parallel(data_dir,dirlist):
Parallel(n_jobs=-1)(delayed(good_or_bad_train_case)(filename, data_dir)
for filename in dirlist if filename.endswith('.dat'))

def sequential(data_dir,dirlist):
t = time.clock()
[good_or_bad_train_case(filename,data_dir) for filename in
dirlist if filename.endswith('.dat')]

def good_or_bad_file(filename,data_dir):
fullname = os.path.join(data_dir, filename)
rootname = os.path.splitext(filename)[0]
f = open(fullname)
content = f.readlines()
if 'NoPhotoOfJoint\r\n' in content or 'PoorPhoto\r\n' in content:
os.symlink(fullname,data_dir+'/bad_data/'+rootname+'.jpg')
os.symlink(fullname,data_dir+'/bad_data/'+rootname+'.dat')
else:
os.symlink(fullname,data_dir+'/good_data/'+rootname+'.jpg')
os.symlink(fullname,data_dir+'/good_data/'+rootname+'.dat')

注意:我知道并行这样一个轻量级的操作没有多大意义;这是练习。

最佳答案

这里有几件事需要注意:

  • joblib 会带来大量开销,因为它必须使用 Python 的 multiprocessing 模块生成单独的进程,然后与这些进程通信以交换数据。它实际上适用于科学计算工作负载,这种开销可以通过子进程中的繁重计算来抵消。
  • 所有工作进程都访问同一磁盘。任何时候只有其中一个可以从磁盘上提取数据,因此如果其余的没有足够的计算来完成,它们就会坐下来等待。 (与 CPU 带宽相比,磁盘带宽微不足道。)
  • 由于磁盘速度非常慢,因此在这种情况下您通常需要两个工作线程,而不是“与 CPU/核心数量一样多”,因为超过第二个工作线程只会增加开销。两个工作进程可以同时保持 CPU 和一个核心忙碌(尽管它们不会给您带来两倍的加速)。
  • joblib 0.8 有一个线程后端,您可以尝试一下。

关于python - 并行化 IO 密集型 for 循环 : stupid idea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970655/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com