相关疑难解决方法(0)

多处理:如何在多个进程之间共享一个字典?

一个程序,它创建可在可连接队列上工作的多个进程Q,并最终可能操纵全局字典D来存储结果.(因此每个子进程可用于D存储其结果,并查看其他子进程正在生成的结果)

如果我在子进程中打印字典D,我会看到已对其进行的修改(即在D上).但是在主进程加入Q之后,如果我打印D,那就是空的dict!

我知道这是一个同步/锁定问题.有人能告诉我这里发生了什么,以及如何同步访问D?

python multiprocessing

98
推荐指数
4
解决办法
7万
查看次数

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

我更精确地使用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()
Run Code Online (Sandbox Code Playgroud)

这种方法具有巨大的内存消耗; 几乎占用了我所有的RAM(此时它变得非常慢,因此使多处理非常无用).我假设问题是这df是一个巨大的对象(一个大型的pandas数据帧),它会被复制到每个进程.我试过使用multiprocessing.Value共享数据帧而不复制

shared_df = multiprocessing.Value(pandas.DataFrame, df)
args = [(shared_df, config1), (shared_df, config2), ...] 
Run Code Online (Sandbox Code Playgroud)

(正如Python多处理共享内存中所建议的那样),但是这给了我TypeError: this type has no size(与在Python进程之间共享一个复杂对象相同,遗憾的是我不理解答案).

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

python multiprocessing pandas

36
推荐指数
4
解决办法
2万
查看次数

与多个Python脚本共享一个dict

我想dict从一个同时运行的多个Python脚本中访问一个唯一的(键/值)数据库.

如果script1.py更新d[2839],script2.py则应在查询几秒后查看修改后的值d[2839].

什么是Pythonic解决方案呢?

注意:我在Windows上,并且dict应该有最多1M项(键和值都是整数).

python sqlite dictionary key-value-store

13
推荐指数
1
解决办法
1343
查看次数

利用"Copy-on-Write"将数据复制到Multiprocessing.Pool()工作进程

我有multiprocessing一些看起来有点像这样的Python代码:

import time
from multiprocessing import Pool
import numpy as np

class MyClass(object):
    def __init__(self):
        self.myAttribute = np.zeros(100000000) # basically a big memory struct

    def my_multithreaded_analysis(self):
        arg_lists = [(self, i) for i in range(10)]
        pool = Pool(processes=10)
        result = pool.map(call_method, arg_lists)
        print result

    def analyze(self, i):
        time.sleep(10)
        return i ** 2

def call_method(args):
    my_instance, i = args
    return my_instance.analyze(i)


if __name__ == '__main__':
    my_instance = MyClass()
    my_instance.my_multithreaded_analysis()
Run Code Online (Sandbox Code Playgroud)

在阅读了有关内存如何在其他StackOverflow答案(例如Python多处理内存使用情况)中工作的答案后,我认为这不会使用内存与我用于多处理的进程数量成比例,因为它是写时复制和我没有修改任何属性my_instance.但是,当我运行顶部时,我确实看到了所有进程的高内存,它说我的大多数进程都使用了大量内存(这是OSX的最高输出,但我可以在Linux上复制).

我的问题基本上是,我是否正确地解释了这一点,因为我的实例MyClass实际上是在池中重复的?如果是这样,我该如何防止这种情况; 我应该不使用这样的结构吗?我的目标是减少计算分析的内存使用量.

PID   COMMAND …
Run Code Online (Sandbox Code Playgroud)

python memory-management multiprocessing python-multiprocessing

11
推荐指数
2
解决办法
2722
查看次数

多处理模块显示每个子进程的内存与主进程相同。

我正在使用 python 的多处理模块,对此有一些困惑。

基本上,我最初在主进程中存储一些数据,大约为 16GB(主内存大小),如 top 命令所示。我已将这些数据存储为全局变量。

然后对这些数据进行多重处理,并相应地进行不同的处理。

现在我看到正在发生多处理,即所有进程都有自己的 CPU 利用率,但所有进程的内存均为 16 GB。为什么会这样。?难道它不应该使用我通过全局变量的引用传递发送的相同内存吗?请一些想法。

top命令的输出如下:-

PID用户PR NI VIRT RES SHR S%CPU%MEM时间+命令13908管理20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python 13429管理20 0 16.7g 16g
3336 S 0.0 17.3 15:06.97 python 13
910管理20 0 16.7克16g 848 R 100.3 17.3 0:32.94 python
13911 管理 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python 13912 管理 20
0 16.7g 16g 836 R 99.6 17.3 0:33.00 python 1
3907 管理 20 0 16.7g 16g …

python linux memory-management

3
推荐指数
1
解决办法
3237
查看次数