如何将巨大的2D NumPy数组写入缓冲区

问题描述

我有一个巨大的2D numpy数组(dtype = bool)和一个缓冲区,我想将此2D数组写入缓冲区。目前,我正在执行以下操作,

# Python version 3.7.7,NumPy version 1.18.5
# shape in the dummy_array is just an example,sometimes will be bigger
dummy_array = np.array(np.empty((599066148,213),dtype='bool'),dtype='bool')

# Pyarrow plasma store buffer
buf = client.create(object_id,dummy_array.nbytes)

# Get a NumPy view of the buffer
array = np.frombuffer(buf,dtype="bool").reshape(dummy_array.shape)

# Write the data or the NumPy array to the buffer
array[:] = dummy_array

问题是这至少需要3分钟。 dummy_array的大小通常为100到200GB,有时甚至更大。我无法弄清楚如何使用question中提到的memoryviewnp.ctypeslib.as_array(buf,shape=dummy_array.shape)来实现2D数组(我尝试过,但是没有用)。任何以更好或更快的方式执行此操作的指针都将非常有用,因为我将执行此操作至少几百次,因此,每次迭代节省30至60秒将节省数小时。

解决方法

您不能分配多维的memoryview切片。

NotImplementedError: memoryview slice assignments are currently restricted to ndim = 1

因此,在将其复制到memoryview之前,您可能需要将其整形为一维。

>>> dummy_array = np.array(np.empty((2,213),dtype='bool'),dtype='bool').reshape(2*213)
>>> mem = memoryview(dummy_array)
>>> mem[0]
True
>>> np.frombuffer(mem,dtype="bool").reshape(dummy_array.shape)
array([ True,True,False,

如果尝试使用多维,则会出现此错误。

>>> dummy_array = np.array(np.empty((2,dtype='bool')
>>> mem = memoryview(dummy_array)
>>> mem[0]
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
NotImplementedError: multi-dimensional sub-views are not implemented

我无法告诉您这是否会比您的其他方法快,但可能会为您提供一些有关如何使memoryview版本正常工作的想法。