【问题标题】:Python multiprocessing.Pool limit on matrix size in passed argumentsPython multiprocessing.Pool 对传递参数中矩阵大小的限制
【发布时间】:2015-12-20 22:04:40
【问题描述】:

我最近发现multiprocessing.Pool 中的apply_async 方法对args=() 中传递的参数大小有限制。真的是这样还​​是我做错了什么?

我附上了一个示例代码,我只是在被调用函数中打印出矩阵的形状。如您所见,在大小为21000 时,该函数不再被调用(并且没有引发异常或警告:\)

import numpy as np
from multiprocessing import Pool

def _mp_print_size(mat):
    try:
        print 'Mat size [%d %d]' % (mat.shape[0], mat.shape[1])
    except Warning as w:
        print w
    except Exception as e:
        print e

def diff_sizes(size):
    print 'Running with size ', size
    mat = np.ones([size, size])

    pool = Pool(2)
    for i in range(2):
        pool.apply_async(func=_mp_print_size, args=(mat, ))

    pool.close()
    pool.join()


if __name__ == '__main__':
    sizes = np.arange(1000, 1000000, 10000)
    for s in sizes:
        diff_sizes(s)

打印出来的是:

Running with size  1000
Mat size [1000 1000]
Mat size [1000 1000]
Running with size  11000
Mat size [11000 11000]
Mat size [11000 11000]
Running with size  21000
Running with size  31000
Running with size  41000
Running with size  51000
Running with size  61000

如果有人问这个问题,我很抱歉 - 与以前的实例相关联,我将不胜感激,因为我自己找不到。

【问题讨论】:

  • 一个 2100x2100 的矩阵相当大,为 441,000,00。它被腌制后传递到池中,最终以千兆字节为单位。当我尝试自己腌制数组时出现 MemoryError。这让我想知道多处理是否会默默地忽略该错误。对于像这样的大型对象,您可能希望使用共享内存。
  • 你在linux上运行吗?如果是这样,mat 已经存在于子进程空间中,因此您不必发送它。
  • tdelaney - 我知道对吧?! Python中的整个多线程/多进程非常缺乏,通过尝试错误发现了大多数东西:\我在linux上运行它,你能详细说明一下吗?我不能只是不将它传递给函数并期望它工作,它不会编译。

标签: python python-multiprocessing


【解决方案1】:

看起来像是http://bugs.python.org/issue8426 的体现,因为multiprocessing.Pool.apply/map 在幕后使用了Queue

我会搜索并添加调试打印到multiprocessing 中的相关调用,以检查是否正在调用与错误讨论中相同的内容和大小相同的参数。

如果是这种情况,这将保证创建另一个错误以使 multiprocessing 检查有效负载大小并将传输拆分为块。

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2021-02-11
    相关资源
    最近更新 更多