Как хранить широкие таблицы в pytables/hdf5

У меня есть данные, исходящие из csv, который содержит несколько тысяч столбцов и десять тысяч (или около того) строк. Внутри каждого столбца данные одного типа, но разные столбцы имеют данные разного типа *. Раньше я собирал данные из numpy и сохранял их на диске, но это довольно медленно, особенно потому, что обычно я хочу загрузить некоторое подмножество столбцов, а не все из них.

Я хочу поместить данные в hdf5 с помощью pytables, и первым моим подходом было размещение данных в одной таблице с одним столбцом hdf5 на столбец csv. К сожалению, это не сработало, я предполагаю из-за ограничения 512 (мягких) столбцов.

Каков разумный способ хранения этих данных?

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

Ответ 1

На самом деле это невозможно сделать наивным образом. HDF5 выделяет 64 kb пространства для метаданных для каждого набора данных. Эти метаданные включают типы столбцов. Таким образом, хотя количество столбцов является мягким пределом, где-то в диапазоне 2-3 тыс. У вас обычно не хватает места для хранения метаданных (в зависимости от длины имен столбцов и т.д.).

Кроме того, не numpy ограничивает количество столбцов до 32? Как вы теперь представляете данные с numpy? Все, что вы можете получить в массив numpy, должно соответствовать классу класса pytables Array.

Ответ 2

Нет pytables, но вместо h5py это может сработать:

data = np.recfromcsv(args[0], delimiter=',',
                     case_sensitive=True, deletechars='', replace_space=' ')
with h5py.File(args[1], 'w') as h5file:
    h5file.create_dataset('table', data=data)

Я взял первую строку из этого ответа; не уверен, что это сработает для вас. Таблица HDF 5 выглядит отлично (от быстрого просмотра с hdfview); конечно, я не знаю, можете ли вы использовать его с pytables и, возможно, pandas.

Ответ 3

Возможно, вы можете увеличить число столбцов без значительной деградации производительности. См.: http://www.pytables.org/docs/manual-2.2.1/apc.html

В .1.1. Рекомендуемые максимальные значения

MAX_COLUMNS

Maximum number of columns in Table objects before a PerformanceWarning is issued. This limit is somewhat arbitrary and can be increased.

Если вы хотите пройти этот маршрут, просто найдите файл parameters.py в каталоге pytables и измените значение MAX_COLUMNS.

Ответ 4

вы можете использовать pandas dataframe он может быть сохранен на диск без преобразования в csv

Ответ 5

ИМХО это зависит от того, что вы хотите делать с данными впоследствии и сколько из них вам нужно за один раз. Мне пришлось создать программу для статистической валидации некоторое время назад, и у нас было два подхода:

  • Разделить столбцы в отдельных таблицах (например, с помощью FK). Накладные расходы на их загрузку не слишком высоки.
  • Транспонирование таблицы, в результате чего что-то вроде хранилища значений ключа, где ключ является кортежем (столбец, строка)

Для обоих мы использовали postgres.