Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多处理并行处理多个文件_Python_Multithreading_Multiprocessing_Python Multiprocessing - Fatal编程技术网

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

Python 使用多处理并行处理多个文件,python,multithreading,multiprocessing,python-multiprocessing,Python,Multithreading,Multiprocessing,Python 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})

我试图了解我使用
多处理.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))

我怎么能看出,在一个处理器中完成一个进程后,它会立即进入下一个文件?

在考虑任何程序的性能时,您必须确定性能是否受I/O(内存、磁盘、网络等)或计算(核心数、核心速度等)的限制

如果I/O是瓶颈,那么拥有多个进程、更快的CPU等是没有意义的

如果计算占用了所有的时间,那么值得投资于多个进程,等等。“计算时间”通常被诊断为问题所在,但经过更仔细的调查发现,它受到计算机内存总线速度的限制,而不是内核时钟速率的限制。在这种情况下,添加多个进程可能会使情况变得更糟

检查

您可以通过对代码进行一些性能评测来检查您的代码(肯定会有一大堆Python评测工具)

我猜

现在大多数情况下,I/O是瓶颈。如果您不想评测代码,那么押注更快的SSD可能是最好的初始方法

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

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

例如,与内核速度相比,从SDRAM向内核传输1字节所需的时间非常慢。我们只希望L3、L2和L1缓存子系统已经正确预测了对1字节的需求,并且已经提前获取了它。如果没有,就有很大的延迟;在这一点上,超线程可以帮助计算机其他进程的整体性能(它们可以抢占并完成一些工作),但对停止的程序却毫无帮助

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

文件系统缓存

在您的情况下,听起来好像只有一个输入文件;这至少会被操作系统缓存到RAM中(前提是它不会太大)

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

在一定程度上,写入的文件也会被缓存。如果将“总处理时间”视为所有数据都写入磁盘,那么最终您将无能为力;无论您在内存中做了什么,操作系统缓存了什么,您都必须等待磁盘完成写入

操作系统的文件系统缓存可能会给人一种文件写入已经完成的初步印象(操作系统将很快开始整合实际驱动器上的数据),但一旦写缓存已满,同一程序的后续运行将被阻止


如果确实要评测代码,请确保长时间(或重复)运行它,以确保评测器所做的测量揭示了计算机的真实底层性能。如果结果显示大部分时间都在file.Read()或file.Write()中,…

您有理由怀疑这种情况吗?我们需要了解一下
dd.save()
内部的情况,以评估这是否是一个好的设计。如果它是I/O绑定的(尤其是如果所有进程都独立地读取同一个文件),那么只会造成拥塞。我不认为同时从多个进程读取同一个文件会是一个大问题,操作系统应该能够轻松地处理它,但是它们是否都写入同一个“不同”的输出文件?后者可能是一个重要的瓶颈。@martineau每个进程都将数据保存到不同的输出文件中,具有相同的结构。后来我对这些文件进行了后期处理,在pandas中构建了一个数据帧,但我认为保存每个文件会更好,因此如果程序因某种原因崩溃,我仍有一些工作要做。这听起来是个不错的策略。您希望如何“看到”另一个流程在一个流程完成时启动?换句话说,为什么在
savefile()
中已有的
print a
不够好?无论如何,你为什么要看这个。我怀疑这里可能有X:Y问题。。。