想象一下以下代码,它简化了我的问题。
import pandas as pd
import numpy as np
from multiprocessing import Pool
# method #1
def foo(i): return data[i]
if __name__ == '__main__':
data = pd.Series(np.array(range(100000)))
pool = Pool(2)
print pool.map(foo,[10,134,8,1])
# method #2
def foo((data,i)): return data[i]
if __name__ == '__main__':
data = pd.Series(np.array(range(100000)))
pool = Pool(2)
print pool.map(foo,[(data,10),(data,134),(data,8),(data,1)])
在第一种方法中,我们将使用全局变量(仅适用于Linux/OSX,Windows上不起作用),然后通过函数访问它。在第二种方法中,我将"data"作为参数的一部分传递。
在处理过程中使用的内存方面,这两种方法之间会有差异吗?
# method #3
def foo((data,i)): return data[i]
if __name__ == '__main__':
data = pd.Series(np.array(range(100000)))
pool = Pool(2)
# reduce the size of the argument passed
data1 = data[:1000]
print pool.map(foo,[(data1,10),(data1,134),(data1,8),(data1,1)])
第三种方法与其传递所有“数据”,因为我们知道只会使用前几条记录,我只传递前1000条记录。这样做会有什么影响吗?
背景:我面临的问题是我有一个大约200万行(内存占用4GB)的大型数据集,将由四个子进程进行一些处理。每个处理过程只涉及少部分数据(20000行),我希望最小化每个并发进程的内存使用。
multiprocessing.__version__: '0.70a1'
- Primerinitializer
参数加到了错误的行。它应该在对Pool(...)
的调用中,而不是对map
的调用中。我还拼错了initializer
的拼写。这就是我从记忆中编写代码的后果 :)。无论如何,现在已经修复了。 - dano