MacOS:为什么Multiprocessing Queue.put停止工作?

时间:2017-10-25 19:25:14

标签: macos python-3.x multiprocessing

我有一个pandas DataFrame,大约有45,000行,类似于:

from numpy  import random
from pandas import DataFrame

df = DataFrame(random.rand(45000, 200))

我试图将所有行分解为多处理队列,如下所示:

from multiprocessing import Queue

rows = [idx_and_row[1] for idx_and_row in df.iterrows()]

my_queue = Queue(maxsize = 0)

for idx, r in enumerate(rows):
    # print(idx)
    my_queue.put(r)

但是当我运行它时,只有大约37,000个内容被放入my_queue然后程序引发了以下错误:

    raise Full
queue.Full

发生了什么,我该如何解决?

2 个答案:

答案 0 :(得分:1)

multiprocessing.Queue旨在用于进程间通信。它不用于存储大量数据。为此,我建议使用RedisMemcached

通常,队列最大大小取决于平台,即使您将其设置为0也是如此。你没有简单的方法来解决这个问题。

答案 1 :(得分:1)

似乎在windows上,multiprocessing.Queue中的最大对象数量是无限的,但在Linux和MacOS上,最大大小为32767,即2 15 - 1,{{3这个数字的意义。

我通过创建一个空的Queue对象然后将它传递给我想要传递给它的所有进程以及另一个进程来解决该程序。附加进程负责用10,000行填充队列,并每隔几秒检查一次,以查看队列是否已清空。当它为空时,又添加了10,000行。这样,处理了所有45,000行。