【发布时间】:2021-12-04 11:14:42
【问题描述】:
我有一个函数,它基本上采用一对整数 (x,y) 并生成一个包含 3000 个元素的向量。所以,我用了:
pool_obj=multiprocessing.Pool()
result=np.array(pool_obj.map(f, RANGE))
其中RANGE 是 x,y 可能分别取的两组值的笛卡尔积。
我的问题是我只需要np.sum(result,axis=0) 3000 长。我想对所有 x 和 y 求和。总共有 1000x1000 对 (x,y)。使用这种方法将创建一个 1000000x3000 大并且超过内存限制的超大数组。
我该如何解决这个问题?
【问题讨论】:
-
如果
RANGE是一个生成器而不是一个数组,pool.map应该只根据需要动态生成输入。那么只要f的输出很小,就不应该有过多的内存使用。 -
Pool.map的文档指出“请注意,对于非常长的迭代,它可能会导致高内存使用。考虑使用带有显式块大小选项的imap()或imap_unordered()以提高效率。 ”。你试过这些吗? -
还有一个额外的要求,即迭代器必须具有
__len__方法,否则池将提前计算所有输入。这是因为它在确定块大小、输出大小以及检查输入是否为空时尝试使用len。 -
非常感谢! imap_unordered 正是我想要的!
标签: python numpy multiprocessing