У меня есть довольно большой файл HDF5, созданный PyTables, который я пытаюсь прочитать на кластере. Я сталкиваюсь с проблемой NumPy при чтении отдельных фрагментов. Давайте рассмотрим пример:
Общая форма массива в HDF5-файле такова,
In [13]: data.shape
Out[13]: (21933063, 800, 3)
Каждая запись в этом массиве представляет собой np.float64
.
Я заставляю каждый узел считывать фрагменты размером (21933063,10,3)
. К сожалению, NumPy, похоже, не может прочитать все 21 миллион подфрагментов одновременно. Я попытался сделать это последовательно, разделив эти срезы на 10 срезов размером (2193306,10,3)
, а затем используя следующее сокращение, чтобы заставить все работать:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
In [9]:
где 1 <= k <= 10
и chunksize = 2193306
. Этот код работает для k <= 9
; в противном случае я получаю следующее:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
Floating point exception
home@mybox 00:00:00 ~
$
Я попытался использовать инструмент memcheck
от Valgrind, чтобы выяснить, что происходит, и похоже, что виновником является PyTables. Два основных файла, которые отображаются в трассировке, это libhdf5.so.6
и файл, связанный с blosc
.
Также, обратите внимание, что если у меня k=8
, я получаю:
In [12]: a.shape
Out[12]: (17546448, 10, 3)
Но если я добавляю последний подфрагмент, я получаю:
In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10], \
dtype=np.float64))
In [15]: a.shape
Out[15]: (592192620,)
Есть ли у кого-нибудь идеи, что делать? Спасибо!