J.B*_*own 6 python multithreading numpy multiprocess
我有一个{string:list}条目的字典D,我在D中为一对字符串(s1,s2)计算函数f(D [s1],D [s2]) - > float.
另外,我创建了一个自定义矩阵类LabeledNumericMatrix,它允许我执行m [ID1,ID2] = 1.0等赋值.
我需要计算f(x,y)并将结果存储在m [x,y]中,用于字符串S集合中的所有2元组,包括s1 = s2时.这很容易编码为循环,但是当集合S的大小增长到10,000或更大的大值时,执行此代码需要相当长的时间.
我存储在标记矩阵m中的结果都不相互依赖.因此,使用python的多线程或多进程服务并行化这个计算似乎很简单.但是,由于cPython不能真正允许我通过线程同时执行f(x,y)的计算和m [x,y]的存储,似乎多进程是我唯一的选择.但是,我不认为多进程被设计为在进程之间传递大约1GB的数据结构,例如我的包含10000x10000元素的标记矩阵结构.
任何人都可以提供(a)如果我应该避免尝试并行化我的算法,以及(b)如果我可以进行并行化,如何做到这一点,最好是在cPython?
创建服务器进程.它是Multiprocessing包的一部分,允许并行访问数据结构.这样,每个进程都将直接访问数据结构,锁定其他进程.
从文档:
服务器进程
Manager()返回的管理器对象控制一个服务器进程,该进程保存Python对象并允许其他进程使用代理操作它们.
Manager()返回的管理器将支持类型列表,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array.
创建一个工作池,一个输入队列和一个结果队列.
您的数据是独立的:f(D [s i ],D [s j ])是一个隐蔽的问题,与任何f(D [s k ],D [s l ])无关.此外,每对的计算时间应该相当相等,或至少在相同的数量级.
将任务划分为n个输入集,其中n是您拥有的计算单元(核心,甚至计算机)的数量.将每个输入集分配给不同的进程,并加入输出.