一个程序,它创建可在可连接队列上工作的多个进程Q,并最终可能操纵全局字典D来存储结果.(因此每个子进程可用于D存储其结果,并查看其他子进程正在生成的结果)
如果我在子进程中打印字典D,我会看到已对其进行的修改(即在D上).但是在主进程加入Q之后,如果我打印D,那就是空的dict!
我知道这是一个同步/锁定问题.有人能告诉我这里发生了什么,以及如何同步访问D?
我更精确地使用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实际上即使在这种情况下使用了正确的事情?我已经看到了其他建议(例如队列),但现在有点困惑.有什么选择可以共享内存,在这种情况下哪一个最好?
我想dict从一个同时运行的多个Python脚本中访问一个唯一的(键/值)数据库.
如果script1.py更新d[2839],script2.py则应在查询几秒后查看修改后的值d[2839].
我想过使用SQLite,但似乎从多个进程并发写入/读取不是SQLite的强项(假设script1.py刚刚修改过d[2839],script2.pySQLite连接怎么会知道它必须重新加载数据库的这个特定部分?)
当我想要刷新修改时,我还考虑过锁定文件(但这样做相当棘手),并使用json.dump序列化,然后尝试检测修改,json.load如果有任何修改则用于重新加载等等......哦,不,我重新发明轮子,重新发明一个特别低效的键/值数据库!
redis看起来像一个解决方案,但它没有正式支持Windows,同样适用于leveldb.
多个脚本可能想要在完全相同的时间写入(即使这是一个非常罕见的事件),有没有办法让数据库系统处理这个(感谢一个锁定参数?似乎默认SQLite不能做这是因为"SQLite支持无限数量的同时读者,但它只会在任何时刻允许一位作者.")
什么是Pythonic解决方案呢?
注意:我在Windows上,并且dict应该有最多1M项(键和值都是整数).
我有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
我正在使用 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 …