Как создать большой массив на основе перестановок - PullRequest
0 голосов
/ 24 сентября 2019

Я генерирую очень большую матрицу перестановок, основанную на числах 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

1 Ответ

0 голосов
/ 24 сентября 2019

Похоже, ваша проблема в большом размере массива.Поэтому создайте меньшие массивы и запишите их в файл hdf5 (Иерархический формат данных), используя h5py.
Это позволит вам управлять объемом пространства,текущий массив извлекается из памяти, при этом он может хранить весь большой массив в файловой системе в файле hdf5 (largefile.h5).

Кроме того, вы также можете использовать pyTables вместо h5py для хранения данных в формате файла hdf5.

Ссылки

Я бы посоветовал вам взглянуть на это:

h5py

  1. Входные и выходные числовые массивы в h5py
  2. h5py Intro
  3. h5py Документация

pyTables

  1. Python: какхранить массив многомерного массива в PyTables?
  2. pyTables Документация
  3. Пример построения массива numpy с использованием pytables
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...