So schreiben Sie ein riesiges 2D-NumPy-Array in einen Puffer

Oct 24 2020

Ich habe ein riesiges 2D-Numpy-Array (dtype = bool) und einen Puffer und möchte dieses 2D-Array in den Puffer schreiben. Derzeit mache ich Folgendes:

# 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

Das Problem ist, dass dies mindestens 3 Minuten dauert. Die Größe des dummy_arrayist normalerweise 100 bis 200 GB und manchmal sogar mehr. Ich konnte nicht herausfinden, wie dies mit memoryviewund np.ctypeslib.as_array(buf, shape=dummy_array.shape)wie in dieser Frage für ein 2D-Array erwähnt wird (ich habe es versucht, aber es hat nicht funktioniert). Alle Hinweise, um dies besser oder schneller zu tun, wären großartig, da ich dies mindestens einige hundert Mal tun werde. Wenn Sie also 30 bis 60 Sekunden pro Iteration sparen, sparen Sie Stunden.

Antworten

forgetso Nov 20 2020 at 16:59

Sie können kein mehrdimensionales Memoryview-Slice zuweisen.

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

Daher müssen Sie Ihr Array möglicherweise eindimensional umformen, bevor Sie es in eine Speicheransicht kopieren können.

>>> 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,  True,  True,  True,  True, False, False,  True,

Wenn Sie versuchen, mehrdimensional zu verwenden, wird dieser Fehler angezeigt.

>>> dummy_array = np.array(np.empty((2, 213), dtype='bool'), 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

Ich kann Ihnen nicht sagen, ob dies schneller als Ihre andere Methode sein wird, aber es kann Ihnen einige Ideen geben, wie Sie die Memoryview-Version zum Laufen bringen können.