使用多处理并行处理多个文件

时间:2017-11-30 05:56:43

标签: python multithreading multiprocessing python-multiprocessing

我试图了解使用multiprocessing.Pool的方式是否有效。我想要并行执行的方法是一个脚本,它读取某个文件,进行计算,然后将结果保存到不同的文件中。我的代码看起来像这样:

from multiprocessing import Pool, TimeoutError
import deepdish.io as dd

def savefile(a,b,t,c,g,e,d):
    print a
    dd.save(str(a),{'b':b,'t':t,'c':c,'g':g,'e':e,'d':d})


def run_many_calcs():
    num_processors = 6
    print "Num processors - ",num_processors
    pool = Pool(processes=num_processors)     # start 4 worker processes
    for a in ['a','b','c','d','e','f','g','t','y','e','r','w']:
        pool.apply(savefile,args=(a,4,5,6,7,8,1))

如何在其中一个处理器中完成一个进程后立即看到它继续下一个文件?

1 个答案:

答案 0 :(得分:1)

在考虑任何程序的性能时,如果性能受I / O(内存,磁盘,网络等)或计算(核心数,核心速度等)的约束,则必须确定性能。

如果I / O是瓶颈,那么没有必要拥有多个进程,更快的CPU等等。

如果计算一直在占用,那么值得投资多个过程等等。"计算时间"通常被诊断为问题,但仔细研究结果却受到计算机内存总线速度的限制,而不是内核的时钟速率。在这种情况下,添加多个流程可能会使事情变得更糟......

检查

您可以通过对代码进行一些性能分析来检查您的代码(对于Python来说,那里必须有大量的分析工具)。

我的猜测

这些天大部分时间它的I / O都是瓶颈。如果您不想分析您的代码,那么投注更快的SSD可能是最好的初始方法。

无法解决的计算机科学问题

现代CPU(L1,L2,L3缓存,QPI,超线程)的架构特征都是计算机设计中潜在问题的症状;对于我们可以包装它们的I / O来说,内核太快了。

例如,与核心速度相比,将1个字节从SDRAM传输到核心所需的时间非常慢。人们只需要希望L3,L2和L1缓存子系统正确地预测了对该1字节的需求,并且已经提前获取了它。如果没有,那就是一个很大的延迟;超线程可以帮助计算机的其他过程的整体性能(它们可以插入并完成一些工作),但对于停滞的程序绝对没有任何作用。

从文件或网络获取的数据确实非常慢。

文件系统缓存

在你的情况下,听起来你有1个单输入文件;这至少会被操作系统缓存在RAM中(前提是它不是太大)。

你可能想要自己把它读入记忆中;我不会打扰。如果它很大,你会分配大量内存来保存它,如果它对于机器中的RAM来说太大了,操作系统会将一些RAM交换到虚拟内存页面文件无论如何,你比以前更糟糕了。如果它足够小,操作系统很有可能会为您缓存整个事情,为您节省麻烦。

写入的文件也会被缓存,直到某一点。如果"总的处理时间"最终你无能为力。意思是说所有数据都写入磁盘;无论你在内存中做了什么以及操作系统缓存了什么,你都必须等待磁盘完成写入。

操作系统的文件系统缓存可能会给人一种初步印象,即文件写入已经完成(操作系统将在短时间内合并实际驱动器上的数据),但是同一程序的连续运行将被阻止写缓存已满。

如果您对代码进行了分析,请确保长时间(或重复)运行代码,以确保分析器所做的测量显示计算机的真正基础性能。如果结果显示大部分时间都在file.Read()或file.Write()...