Я создал большой (120 ГБ; 1 миллиард строк) файл HDF5 с помощью pandas. После первоначального создания файла hdf я добавил в файл так:
with pd.get_store(path_output) as hdf_output:
for i in range(BIG_LOOP):
df = ...
hdf_output.append('all', df, data_columns=[])
Я специально установил data_columns = [], чтобы избежать индексации во время создания. Теперь, когда у меня есть файл HDF, я хотел бы добавить индексы к нескольким столбцам (скажем, columns_to_index = ['A', 'B', 'C'])
Почему-то, судя по ptdump, у меня сейчас data_columns:=['A']
, но я не помню, как это произошло. (Возможно, исходный df был написан с другим параметром (я последовательно добавлял в hdfstore в течение нескольких дней и, возможно, что-то изменил). В любом случае, однако, независимо от того, как это было создано, я хотел бы проиндексировать дополнительные столбцы.
Очевидно, просто позвонить mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full')
не получится. В первый раз, когда я запустил его, он перемешался в течение часа и добавил 2 ГБ к размеру файла (проверка метаданных показывает, что размер фрагмента был увеличен), но у меня нет всех трех индексов (только индекс для 'A'). Как я могу создать индекс для всех трех столбцов?
Я также заметил эту строку в ptdump - мне кажется, что у меня есть "non_index_axes" для элементов, которые я хочу проиндексировать: non_index_axes := [(1, ['A', 'B', 'C'])]
Если невозможно создать индекс в пандах, я был бы признателен за совет о том, как это сделать прямо в pytables. (например, мне нужно сначала удалить какие-либо существующие индексы? и как мне изменить "non_index_axes" и "data_coumns")
Изменить: предвидя вопросы о моем варианте использования, вот общая картина того, чего я пытаюсь достичь:
Прочтите 120 ГБ данных из файлов CSV. Каждый файл представляет собой финансовые данные за один день и состоит из 100 000 строк с примерно дюжиной столбцов в каждой строке. Я просто сохраняю каждую строку последовательно в файле HDF5. Я бы хотел, чтобы этот начальный этап прошел быстро, поэтому я отключил индексацию. В настоящее время я читаю и анализирую каждый файл CSV за 6 секунд, а сохранение в файл HDF5, как указано выше, занимает всего 1,5 секунды.
Проиндексируйте несколько (не все) столбцов для поддержки различных запросов, таких как получение всех элементов с заданной строкой в столбце 1 и датой из столбца 2 в определенном диапазоне.
По прошествии времени я каждый день буду анализировать новый файл CSV и добавлять его в файл HDF5. Ожидаю, что индексы и дальше будут обновляться.
(В зависимости от моих шаблонов доступа порядок, в котором я храню строки (в настоящее время, по дате), может по-прежнему быть лучшим порядком для поиска. Мне также может потребоваться сортировка по другому столбцу в большинстве запросов, и в этом случае я думаю Мне нужно будет повторно отсортировать таблицу после того, как каждый файл CSV будет проанализирован и добавлен.)
В настоящее время я застрял на шаге 2, генерируя индексы столбцов.