Floating Point Exception with Numpy and PyTables

У меня есть довольно большой файл 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,)

Есть ли у кого-нибудь идеи, что делать? Спасибо!

14
задан Tarun Chitra 30 September 2011 в 23:46
поделиться