Я генерирую очень большую матрицу перестановок, основанную на числах 0,1 и 2. В идеале, я хочу, чтобы их было 48 в ширину, но даже доволен 20. Теперь у меня не хватает памяти, поэтому хотелось посмотреть, есть либыла доступна опция, не основанная на памяти.
Я пробовал ее на большой памяти, но я бы предпочел вариант, который использует диск (у меня быстрый SSD), даже если это занимает много времени.Как видите, я уже сделал int8 вместо int32 для экономии места, но даже это зашло так далеко.Размер сетки 18 равен 6,5 ГБ, где 19 - 21 ГБ, поэтому я понимаю, что он растет в геометрической прогрессии, и я скоро буду ТБ.
import numpy as np
class LargeGrid():
def permgrid(self, m, n):
inds = np.indices((m,) * n, dtype=np.int8)
arr = inds.reshape(n, -1).T
arr[arr == 2] = -1
return arr
def save(self):
grid_size = 24
grid = self.permgrid(3,grid_size)
np.save('grid', grid)
lg = LargeGrid()
lg.save()
Ожидается очень большой файл на диске, но в итоге получится:
Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] on win32
MemoryError: Unable to allocate array with shape (24, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3) and data type int8