Чтение большого текстового файла в hdf5 через PyTables или PyHDF?

Я пытаюсь получить статистику с помощью SciPy, но мой набор входных данных довольно велик (~ 1,9 ГБ) и находится в формате dbf. Размер файла достаточно велик, и Numpy возвращает сообщение об ошибке, когда я пытаюсь создать массив с помощью genfromtxt. (У меня 3 ГБ оперативной памяти, но работает Win32).

i.e.:

Traceback (most recent call last):

  File "<pyshell#5>", line 1, in <module>
    ind_sum = numpy.genfromtxt(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf", dtype = (int, int, int, float, float, int), names = True, usecols = (5))

File "C:\Python26\ArcGIS10.0\lib\site-packages\numpy\lib\npyio.py", line 1335, in genfromtxt
    for (i, line) in enumerate(itertools.chain([first_line, ], fhd)):

MemoryError

Из других сообщений я вижу, что фрагментированный массив, предоставляемый PyTables, может быть полезен, но моя проблема заключается в чтении этих данных в первую очередь. Или, другими словами, PyTables или PyHDF легко создают желаемый результат HDF5, но что мне делать, чтобы сначала получить свои данные в массиве?

Например:

import numpy, scipy, tables

h5file = tables.openFile(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\HET_IND_SUM2.h5", mode = "w", title = "Diversity Index Results")

group = h5.createGroup("/", "IND_SUM", "Aggregated Index Values"`)

а затем я мог бы создать таблицу или массив, но как мне вернуться к исходным данным dbf? В описании?

Спасибо за любые мысли, которые у вас есть!


person jsnider    schedule 07.01.2011    source источник


Ответы (2)


Если данные слишком велики для размещения в памяти, вы можете работать с отображенным в память файлом (это похоже на массив numpy, но хранится на диске - см. документацию здесь), хотя вы можете получить аналогичные результаты с помощью HDF5 в зависимости от того, какие операции вам нужно выполнить с массивом. Очевидно, это замедлит выполнение многих операций, но это лучше, чем неспособность их выполнять вообще.

Поскольку вы достигли предела памяти, я думаю, вы не можете использовать genfromtxt. Вместо этого вы должны перебирать текстовый файл по одной строке за раз и записывать данные в соответствующую позицию в объекте memmap / hdf5.

Непонятно, что вы имеете в виду под «обращением к исходным данным dbf»? Очевидно, вы можете просто сохранить имя файла, откуда оно пришло. Объекты HDF5 имеют «атрибуты», которые предназначены для хранения таких метаданных.

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

person DaveP    schedule 07.01.2011
comment
Если его входной файл имеет размер 1,9 ГБ, он не сможет использовать его в 32-битной ОС, и у его кода на Python все еще останется адресное пространство для преобразования. - person user57368; 08.01.2011
comment
Большое спасибо. Я воспользуюсь предложенным вами маршрутом с отображением памяти. Я ценю, что вы нашли время поделиться своими мыслями. Я дам вам знать, получу ли я это и работаю, хотя меня все еще беспокоит, что я все еще ограничен 32-битной ОС. Думаю, посмотрим, как пойдет. Спасибо еще раз. - person jsnider; 08.01.2011

Если данные находятся в файле dbf, вы можете попробовать мой пакет dbf - он сохраняет только записи в памяти, к которым осуществляется доступ, поэтому вы должны иметь возможность циклически просматривать записи, извлекая нужные вам данные:

import dbf

table = dbf.Table(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf")

sums = [0, 0, 0, 0.0, 0.0, 0]

for record in table:
    for index in range(5):
         sums[index] += record[index]
person Ethan Furman    schedule 13.07.2011