【问题标题】:passing numpy arrays through multiprocessing.Queue通过 multiprocessing.Queue 传递 numpy 数组
【发布时间】: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 使用率。我想避免计算酸洗的工作。添加一个额外的压缩步骤会使它变得更慢,对吧?理想情况下,我只想将数组存储在共享内存中,让其他进程直接访问它?
  • stackoverflow.com/questions/17785275/… 应该涵盖所有内容

标签: python numpy parallel-processing multiprocessing pickle


【解决方案1】:

问题不在于 numpy,而在于 pickle 如何表示数据的默认设置(作为字符串,因此输出是人类可读的)。您可以change the default settings for pickle 改为生成二进制数据。

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 版本如何,使用二进制协议都可以节省空间)。

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

【讨论】:

    【解决方案2】:

    Share Large, Read-Only Numpy Array Between Multiprocessing Processes

    这应该涵盖所有内容。无论使用何种协议,酸洗不可压缩的二进制数据都是一种痛苦,因此这种解决方案非常受欢迎。

    【讨论】:

    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-11-13
    • 2017-01-07
    相关资源
    最近更新 更多