【发布时间】:2014-02-19 23:49:51
【问题描述】:
我使用multiprocessing.Queue 在python 进程之间传递float64 的numpy 数组。这工作正常,但我担心它可能没有它应有的效率。
根据multiprocessing 的文档,放置在Queue 上的对象将被腌制。在 numpy 数组上调用 pickle 会产生数据的文本表示,因此空字节会被字符串 "\\x00" 替换。
>>> pickle.dumps(numpy.zeros(10))
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I10\ntp6\ncnumpy\ndtype\np7\n(S'f8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb."
我担心这意味着我的数组被昂贵地转换为原始大小的 4 倍,然后在另一个过程中转换回来。
有没有办法以原始未更改的形式通过队列传递数据?
我知道共享内存,但如果这是正确的解决方案,我不确定如何在其上构建队列。
谢谢!
【问题讨论】:
-
发送前可以先压缩zlib.compress(pickle.dumps(numpy.zeros(10)))
-
谢谢。这确实会使它变小,但在这种情况下,我实际上更关心 CPU 使用率。我想避免计算酸洗的工作。添加一个额外的压缩步骤会使它变得更慢,对吧?理想情况下,我只想将数组存储在共享内存中,让其他进程直接访问它?
标签: python numpy parallel-processing multiprocessing pickle