2013-11-18 3 views
11

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

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

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

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

ответ

2

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

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

+0

В настоящее время хранится как обычный словарь массивов numpy. – acrophobia

+3

32 предела столбца в numpy? Нет такого предела. numpy никогда не снимался с таким пределом. –

+1

@PhilCooper OP может означать «размеры», а не столбцы. numpy имеет предел 32 для размерности. https://github.com/numpy/numpy/issues/5744 –

1

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

C.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.

+0

Да, я действительно рассматривал это, но думал, что если бы мне пришлось сменить этот вид конфигурации с самого начала, я, вероятно, делал что-то неправильно. – acrophobia

+0

Если ваши данные разрежены (что означает, что у многих строк есть только небольшое подмножество значений столбцов), вы можете попробовать реорганизовать свои таблицы. В качестве альтернативы я знаю, что numpy имеет опции для загрузки только определенных столбцов через x, y = np.loadtxt (файл, разделитель = ',', usecols = (0, 2)). Поэтому, как только у вас есть данные на диске, вы можете загружать различные подмножества столбцов. Я не уверен, что функция оптимизирована для такого случая. – Paul

1

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

1

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

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

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

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) 

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

Смежные вопросы