Создание огромного массива с использованием pytables - PullRequest
7 голосов
/ 27 декабря 2011

Как я могу создать огромный массив с использованием pytables. Я попробовал это, но выдает «ValueError: массив слишком большой». Ошибка:

import numpy as np
import tables as tb
ndim = 60000
h5file = tb.openFile('test.h5', mode='w', title="Test Array")
root = h5file.root
h5file.createArray(root, "test", np.zeros((ndim,ndim), dtype=float))
h5file.close()

Ответы [ 2 ]

15 голосов
/ 27 декабря 2011

В сочетании с ответом @ b1r3k, чтобы создать массив, к которому вы не собираетесь обращаться сразу (т. Е. Перенести все это в память), вы хотите использовать CArray (Chunked Array).Идея состоит в том, что вы затем заполните и получите к нему доступ постепенно:

import numpy as np
import tables as tb
ndim = 60000
h5file = tb.openFile('test.h5', mode='w', title="Test Array")
root = h5file.root
x = h5file.createCArray(root,'x',tb.Float64Atom(),shape=(ndim,ndim))
x[:100,:100] = np.random.random(size=(100,100)) # Now put in some data
h5file.close()
8 голосов
/ 27 декабря 2011

Вы можете попробовать использовать таблицы tables.CArray, так как он поддерживает сжатие, но ...

Я думаю, что вопросы больше касаются numpy, чем pytables, потому что вы создаете массив, используя numpy, перед тем, как хранить его в pytables.

Таким образом, вам нужно много оперативной памяти для выполнения np.zeros ((ndim, ndim) - и это, вероятно, место, где возникает исключение: «ValueError: массив слишком большой.» .

Если матрица / массив не плотные, вы можете использовать разреженное представление матрицы, доступное в scipy: http://docs.scipy.org/doc/scipy/reference/sparse.html

Другое решение состоит в том, чтобы попытаться получить доступ к вашему массиву через чанки, если вам не нужен весь массив сразу - проверьте этот поток: Очень большие матрицы с использованием Python и NumPy

...