Pandas — получение столбцов HDF5 и использование памяти

У меня простой вопрос, я не могу не чувствовать, что упускаю что-то очевидное.

Я прочитал данные из исходной таблицы (SQL Server) и создал файл HDF5 для хранения данных с помощью следующего:

output.to_hdf('h5name', 'df', format='table', data_columns=True, append=True, complib='blosc', min_itemsize = 10)

Набор данных составляет ~ 50 миллионов строк и 11 столбцов.

Если я прочитаю весь HDF5 обратно в кадр данных (через HDFStore.select или read_hdf), он потребляет около 24 ГБ ОЗУ. Если я анализирую определенные столбцы в операторах чтения (например, выбирая 2 или 3 столбца), фрейм данных теперь возвращает только эти столбцы, однако потребляется такое же количество памяти (24 ГБ).

Это работает на Python 2.7 с Pandas 0.14.

Я упускаю что-то очевидное?

РЕДАКТИРОВАТЬ: я думаю, что ответил на свой вопрос. Хотя я много искал перед публикацией, очевидно, что после публикации я нашел полезную ссылку: https://github.com/pydata/pandas/issues/6379

Любые предложения по оптимизации этого процесса были бы замечательными, из-за ограничений памяти я не могу достичь пика памяти, необходимого для выпуска через gc.


person Craig S    schedule 17.09.2014    source источник
comment
Python 2.4 вам определенно следует подумать об обновлении, это не поддерживается (или вы имеете в виду 3.4 ??).   -  person Andy Hayden    schedule 18.09.2014
comment
Извините, 2.7. Усталые глаза.   -  person Craig S    schedule 18.09.2014


Ответы (1)


HDFStore в табличном формате — это хранилище, ориентированное на строки. При выборе индексов запроса по строкам, но для каждой строки вы получаете каждый столбец. выбор подмножества столбцов выполняет переиндексацию в конце.

Есть несколько подходов к этому:

  • используйте хранилище столбцов, например bcolz; в настоящее время это не реализовано PyTables, поэтому это потребует немало работы.
  • фрагмент через таблицу, см. здесь и объединить в конце - это будет использовать постоянную память
  • хранить как фиксированный формат - это более эффективный формат хранения, поэтому он будет использовать меньше памяти (но не может быть добавлен)
  • создайте собственное хранилище столбцов, сохранив его в несколько подтаблиц и используя select_as_multiple, см. здесь

какие варианты вы выберете, зависит от характера вашего доступа к данным

примечание: вы можете не захотеть иметь все столбцы как data_columns, если вы действительно не собираетесь выбирать из всех (вы можете запрашивать только ON data_column или индекс), это ускорит хранение/запрос

person Jeff    schedule 18.09.2014