当前位置: 首页 > 知识库问答 >
问题:

python中的多处理--在多个进程之间共享大型对象(例如pandas dataframe)

罗伟志
2023-03-14

我使用的是Python多处理,更准确地说

from multiprocessing import Pool
p = Pool(15)

args = [(df, config1), (df, config2), ...] #list of args - df is the same object in each tuple
res = p.map_async(func, args) #func is some arbitrary function
p.close()
p.join()

这种方法具有巨大的内存消耗;几乎消耗了我所有的RAM(此时它变得非常慢,因此使多重处理变得非常无用)。我认为问题在于df是一个巨大的对象(一个大型pandas数据文件),每个进程都要复制它。我尝试使用multiprocessing.value共享数据文件,而不复制

shared_df = multiprocessing.Value(pandas.DataFrame, df)
args = [(shared_df, config1), (shared_df, config2), ...] 

我是第一次使用多重处理,也许我的理解还不够好。multiprocessing.value实际上是在这种情况下使用的正确方法吗?我已经看到了其他的建议(例如队列),但现在有点困惑。共享内存有哪些选择,在这种情况下哪一个是最好的?

共有1个答案

归俊杰
2023-03-14

的第一个参数是typecode_or_type。定义为:

typecode_or_type确定返回对象的类型:它要么是ctypes类型,要么是数组模块使用的一个字符类型。*args传递给类型的构造函数。

强调我的。因此,不能将pandas dataframe放在中,它必须是ctypes类型。

from multiprocessing import Manager

mgr = Manager()
ns = mgr.Namespace()
ns.df = my_dataframe

# now just give your processes access to ns, i.e. most simply
# p = Process(target=worker, args=(ns, work_unit))

我没有/不打算讨论的一件事是事件和信号--如果您的流程需要等待其他人完成执行,您需要将其添加进来。下面是一个包含一些事件示例的页面,这些示例还详细介绍了如何使用管理器的命名空间

(请注意,这些都没有涉及multiprocessing是否会带来切实的性能优势,这只是为您提供了探索这个问题的工具)

 类似资料:
  • 问题内容: 一个程序,该程序创建在可连接队列上工作的多个进程,并且最终可能会操纵全局字典来存储结果。(因此,每个子进程都可以用来存储其结果,并查看其他子进程正在产生什么结果) 如果我在子进程中打印字典,则可以看到对它进行的修改(即在上)。但是在主流程加入之后,如果我打印D,那就是空洞的字典! 我了解这是同步/锁定问题。有人可以告诉我这里发生了什么,如何同步对的访问? 问题答案: 普遍的答案涉及使用

  • 我想在多个python进程之间共享。以便从其他python进程发送。 如何跨多个python进程共享。 代码如下: 目标是从通道从其他python进程发送。

  • 问题内容: 我知道如何将其用于创建共享对象,尤其是可以在工作人员之间共享的队列。有这个问题,这个问题,[这个问题](http://codingdict.com/questions/1299甚至是我自己的一个问题。 但是,我需要定义很多队列,每个队列都链接一对特定的进程。假设每对进程及其链接队列均由变量标识。 当我需要放置和获取数据时,我想使用字典来访问我的队列。我无法完成这项工作。我已经尝试了很多

  • 问题内容: 通过回答此问题,可以回答所有其他三个问题。希望我能说清楚: 在通过多处理创建的某些过程中创建对象后: 如何将对该对象的 引用 传递给其他进程? (不是很重要)我如何确保持有参考书时此过程不会消失? 示例1(已解决) 例子2 假设返回一个具有可变状态的对象。这个相同的对象应该可以从其他进程访问。 例子3 我有一个带有打开文件和锁的对象-如何授予对其他进程的访问权限? 提醒 我不希望此特定

  • 问题内容: 我有一个类似大型的对象,需要在多个工作进程之间共享。每个工作人员读取对象中信息的随机子集,并对其进行一些计算。我想避免复制大对象,因为我的机器很快耗尽了内存。 我正在处理此SO问题的代码,并对其进行了一些修改以使用固定大小的进程池,该池更适合于我的用例。然而,这似乎打破了它。 输出是 如您所见,在第一种情况下,所有工作进程都获得相同的对象(按ID)。在第二种情况下,id不相同。这是否意

  • 问题内容: 该模块的文档显示了如何将队列传递给以开头的进程。但是,如何与开始的异步工作进程共享队列?我不需要动态加入或其他任何方式,而只是工人(反复)将其结果报告给基地的一种方法。 失败的原因是: 。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/酸洗(以及所有Windows特殊限制)。但如何 做 我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮忙? 问