Python 通过具有迭代器的复杂类函数对大型数据集进行多处理
我在多处理上搜索了大概10个线程,但似乎没有任何东西完全适合我的用例。下面是我想要并行化的大致概念Python 通过具有迭代器的复杂类函数对大型数据集进行多处理,python,concurrency,multiprocessing,pathos,Python,Concurrency,Multiprocessing,Pathos,我在多处理上搜索了大概10个线程,但似乎没有任何东西完全适合我的用例。下面是我想要并行化的大致概念 class foo(): def boo(): filename = 'path to the data file' with reader(filename) as fileReader: for id, feature in fileReader: boo2(id, feature) de
class foo():
def boo():
filename = 'path to the data file'
with reader(filename) as fileReader:
for id, feature in fileReader:
boo2(id, feature)
def boo2(id, feature):
*process feature then save the output to a folder*
在这里,我想并行化对boo2的调用,其中fileReader是pykaldi的迭代器a,具有上万行的id和feature,其中id是字符串,每个feature是一个矩阵,数百行x数十列。boo2将计算一个较小的矩阵,并根据id将结果保存到一个文件夹中。每个对boo2的调用都是相互独立的,因此我想将其并行化
根据我的理解,我不能使用multiprocessing.Pool,因为boo2是一个类函数,由于它的复杂性,我不能从类中提取它
我不知道如何使用多处理。进程,因为核心的数量远小于迭代器的行数,而且我不确定如何在启动和加入进程后将新的boo2调用排队。我尝试将fileReader拆分为n个批,并设置每个批的进程,但我更喜欢将调用排队在一行中,而不是一个多批次
我还研究了pathos模块,因为它在类函数方面没有问题。然而,从示例用例来看,最符合我需要的是:
pathos.threading.ThreadPoolpool.imap(boo2, [feature for feature in fileReader])
但由于fileReader有多大,我无法在内存中安装[feature for feature in fileReader]
非常感谢您的帮助。谢谢。由于类成员的原因,您将无法使用多处理,您需要一个单独的函数来实现这一点-您是对的 关于使用线程,我建议您不要使用简单的理解[feature for feature in fileReader],而是根据可用的CPU线程分批从fileReader中读取功能,然后运行线程,等待完成,然后读取下一批,等等 比如:
def make_next_batch( fileReader ) :
batch = []
for feature in fileReader :
if len(batch) == BATCH_SIZE :
yield batch
batch = []
batch.append( feature )
if len(batch) :
yield batch
然后您必须同时在内存中只保留批量大小的功能。谢谢您的回复@lenik。然而,在这个实现中,我被每个批次中最慢的流程所束缚。如果可能的话,我希望每个核心进程都是异步的。然后,您必须像threading.map那样手动执行,而无需将所有数据加载到内存中。这并没有那么复杂,你有一堆线程,检查其中一些线程是否完成,并使用生成器的下一个特性旋转新线程。也许这会有帮助: