Python 通过multiprocessing.Queue传递numpy数组

Python 通过multiprocessing.Queue传递numpy数组,python,numpy,parallel-processing,multiprocessing,pickle,Python,Numpy,Parallel Processing,Multiprocessing,Pickle,我使用multiprocessing.Queue在python进程之间传递float64的numpy数组。这是工作良好,但我担心它可能没有它可能是有效的 根据多处理的文档,放置在队列上的对象将被酸洗。在numpy数组上调用pickle会导致数据的文本表示,因此空字节会被字符串“\\x00”替换 >pickle.dumps(numpy.zero(10)) “cnumpy.core.multiarray\n\u重构\np0\n import numpy import cPickle as pickl

我使用
multiprocessing.Queue
在python进程之间传递
float64
的numpy数组。这是工作良好,但我担心它可能没有它可能是有效的

根据
多处理
的文档,放置在
队列
上的对象将被酸洗。在numpy数组上调用
pickle
会导致数据的文本表示,因此空字节会被字符串
“\\x00”
替换

>pickle.dumps(numpy.zero(10))

“cnumpy.core.multiarray\n\u重构\np0\n

import numpy
import cPickle as pickle

N = 1000
a0 = pickle.dumps(numpy.zeros(N))
a1 = pickle.dumps(numpy.zeros(N), protocol=-1)

print "a0", len(a0)   # 32155
print "a1", len(a1)   #  8133
另外,请注意,如果您想减少处理器的工作和时间,您可能应该使用
cPickle
而不是pickle(但是由于使用二进制协议而节省的空间不考虑pickle版本)

关于共享内存:
在共享内存问题上,有一些事情需要考虑。共享数据通常会给代码增加大量的复杂性。基本上,对于使用该数据的每一行代码,您都需要担心另一个进程中的其他代码行是否同时使用该数据。n你在做什么。好处是你可以节省来回发送数据的时间。Eelco提出的问题是60GB阵列,在这方面没有选择,必须共享。另一方面,对于大多数相当复杂的代码,决定共享数据只是为了节省几微秒或字节可能是其中之一可能进行的最糟糕的过早优化。


这应该涵盖了所有内容。无论使用何种协议,不可压缩二进制数据的pickle都是一个难题,因此此解决方案是首选方案。

您可以在发送zlib.compress(pickle.dumps(numpy.zeros(10))之前压缩它)谢谢。这确实会使它变小,但在这种情况下,我实际上更关心CPU的使用。我想避免计算酸洗的工作。添加额外的压缩步骤会使它更慢,对吗?理想情况下,我只想将数组存储在共享内存中,让另一个进程直接访问它?这应该涵盖所有这些(在链接中引用)