问题描述
我有一个巨大的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中提到的memoryview
和np.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版本正常工作的想法。