Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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_Concurrency_Multiprocessing_Pathos - Fatal编程技术网

Python 通过具有迭代器的复杂类函数对大型数据集进行多处理

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

我在多处理上搜索了大概10个线程,但似乎没有任何东西完全适合我的用例。下面是我想要并行化的大致概念

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那样手动执行,而无需将所有数据加载到内存中。这并没有那么复杂,你有一堆线程,检查其中一些线程是否完成,并使用生成器的下一个特性旋转新线程。也许这会有帮助: