【发布时间】:2015-05-05 21:26:34
【问题描述】:
我正试图弄清楚在不同进程之间共享相同数据源的最有效且内存消耗更少的方法是什么。
想象一下下面的代码,它可以简化我的问题。
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)])
在第一种方法中,将使用全局变量(在 Windows 上不起作用,仅在 Linux/OSX 上),然后由函数访问。在第二种方法中,我将“数据”作为参数的一部分传递。
就过程中使用的内存而言,这两种方式会有区别吗?
# 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 行),我想尽量减少每个并发进程的内存使用。
【问题讨论】:
标签: python pandas dataset multiprocessing shared-memory