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 使用全局变量,但什么都没有……
【问题讨论】:
我在论坛上阅读了几个关于这个问题的主题,但我还不够好,无法单独找到解决方案。你能告诉我什么是共享数据的正确方法吗? 如果您正在寻找可以互换使用multiprocessing
或 threading
的 GA 代码,那么您可能希望查看使用 mystic
,当使用 ThreadingPool
实例运行时pathos.multiprocessing
的 multiprocessing
的分支可以满足您的需求——使用线程并行 GA,而不会造成巨大的内存损失。在此处获取所有相关代码:github.com/uqfoundation。我会回答这个问题,因为这确实是您的问题所在……但问题已经结束。
【参考方案1】:
多处理模块使用多进程模型而不是线程模型,因此每个进程不能共享内存(不使用共享内存 IPC 调用)。如果您需要使用线程来共享内存,则需要重新设计 Deap 框架。
【讨论】:
以上是关于Python - 多处理和共享内存的主要内容,如果未能解决你的问题,请参考以下文章