Cara menulis array 2D NumPy yang besar ke dalam buffer

Oct 24 2020

Saya memiliki array numpy 2D yang besar (dtype = bool) dan buffer dan saya ingin menulis array 2D ini ke dalam buffer. Saat ini, saya melakukan hal berikut,

# 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

Masalahnya adalah ini membutuhkan setidaknya 3 menit. Ukurannya dummy_arraybiasanya 100 hingga 200GB dan terkadang bahkan lebih. Saya tidak tahu bagaimana melakukan ini dengan menggunakan memoryviewdan np.ctypeslib.as_array(buf, shape=dummy_array.shape)seperti yang disebutkan dalam pertanyaan ini untuk array 2D (saya mencoba, tetapi tidak berhasil). Petunjuk untuk melakukan ini dengan cara yang lebih baik atau lebih cepat akan sangat bagus karena saya akan melakukan ini setidaknya beberapa ratus kali, jadi, menghemat bahkan 30 hingga 60 detik per iterasi akan menghemat waktu.

Jawaban

forgetso Nov 20 2020 at 16:59

Anda tidak dapat menetapkan potongan memoryview multi dimensi.

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

Jadi Anda mungkin perlu membentuk kembali array Anda menjadi satu dimensi sebelum menyalinnya ke 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,  True,  True,  True,  True, False, False,  True,

Jika Anda mencoba menggunakan multidimensi, Anda akan mendapatkan kesalahan ini.

>>> 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

Saya tidak dapat memberi tahu Anda apakah ini akan lebih cepat daripada metode Anda yang lain, tetapi mungkin memberi Anda beberapa ide tentang cara membuat versi memoryview berfungsi.