Python - 多处理和共享内存

Posted

技术标签:

【中文标题】Python - 多处理和共享内存【英文标题】:Python - Multiprocessing and shared memory [duplicate] 【发布时间】:2015-03-15 10:20:46 【问题描述】:

我正在使用 Deap 框架实现遗传算法。 该算法有效,但我注意到 GA 的多进程版本非常消耗内存 9 GB,而单进程的 2 GB 我怀疑是因为它已经为每个进程分配了内存。事实上,一旦执行映射,使用的内存就会增加。 由于进程之间共享的数据只用于读取,所以它们都可以访问相同的内存。

这是我的代码结构。

def evaluate(individual, dataset=None):

    penalty = dataset.compute(individual)

    return penalty


def initialize():
   dataset = dataset(file1, file2)

   pool = multiprocessing.Pool()
   toolbox.register("map", pool.map)

   toolbox.register("evaluate", evaluate, dataset=dataset)

   return toolbox, dataset


def main():
   toolbox, dataset = initialize()

   dataset.data = some_training_set

   fitnesses = toolbox.map(toolbox.evaluate, population)

   dataset.data = some_validation_set

   fitnesses = toolbox.map(toolbox.evaluate, population)

然后我有一个包含数据集(使用 pandas 读取)和字典的类。

class Dataset:

    def __init__(self, file1, file2):
        self.data = read(file1)
        self.dict = loadpickle(file2)

    def compute(self, individual):
       for row in self.data
           # some stuff reading row and self.dict

共享内存的最简单方法是什么?我尝试对 self.data 和 self.dict 使用全局变量,但什么都没有……

【问题讨论】:

我在论坛上阅读了几个关于这个问题的主题,但我还不够好,无法单独找到解决方案。你能告诉我什么是共享数据的正确方法吗? 如果您正在寻找可以互换使用 multiprocessingthreading 的 GA 代码,那么您可能希望查看使用 mystic,当使用 ThreadingPool 实例运行时pathos.multiprocessingmultiprocessing 的分支可以满足您的需求——使用线程并行 GA,而不会造成巨大的内存损失。在此处获取所有相关代码:github.com/uqfoundation。我会回答这个问题,因为这确实是您的问题所在……但问题已经结束。 【参考方案1】:

多处理模块使用多进程模型而不是线程模型,因此每个进程不能共享内存(不使用共享内存 IPC 调用)。如果您需要使用线程来共享内存,则需要重新设计 Deap 框架。

【讨论】:

以上是关于Python - 多处理和共享内存的主要内容,如果未能解决你的问题,请参考以下文章

在 python 多处理中传递共享内存变量

如何在 python 中跨多处理器共享内存?

Gunicorn 在多处理进程和工作进程之间共享内存

在 Python 多处理中将 Pool.map 与共享内存数组结合起来

python与池共享内存

python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array