Como escrever um grande array NumPy 2D em um buffer
Eu tenho um enorme array numpy 2D (dtype = bool) e um buffer e gostaria de escrever este array 2D no buffer. Atualmente, eu faço o seguinte,
# 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
O problema é que isso leva pelo menos 3 minutos. O tamanho do dummy_arraygeralmente é de 100 a 200 GB e às vezes até mais. Não consegui descobrir como fazer isso usando memoryviewe, np.ctypeslib.as_array(buf, shape=dummy_array.shape)conforme mencionado nesta pergunta, para um array 2D (tentei, mas não funcionou). Qualquer sugestão para fazer isso de uma forma melhor ou mais rápida seria ótimo porque farei isso pelo menos algumas centenas de vezes, portanto, economizar até 30 a 60 segundos por iteração economizaria horas.
Respostas
Você não pode atribuir uma fatia do memoryview multidimensional.
NotImplementedError: memoryview slice assignments are currently restricted to ndim = 1
Portanto, você pode precisar remodelar seu array para ser unidimensional antes de copiá-lo para um 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,
Se você tentar usar o multidimensional, receberá este erro.
>>> 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
Não posso dizer se isso será mais rápido do que o seu outro método, mas pode dar-lhe algumas idéias de como fazer a versão do memoryview funcionar.