2016-08-01 8 views
2

Я создал большой (120 ГБ, 1 миллиард строк) файл HDF5 с помощью панд. После первоначального создания файла HDF, я добавил в файл следующим образом:pandas.HDFStore: Как изменить «data_columns» для существующего хранилища? Я хотел бы добавить индекс в столбец не в столбцах данных

with pd.get_store(path_output) as hdf_output: 
    for i in range(BIG_LOOP): 
    df = ... 
    hdf_output.append('all', df, data_columns=[]) 

I целеустремленно набор 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 ГБ к файловому размеру (проверка метаданных показывает, что chunksize был увеличен), но я не есть все 3 индекса (только индекс для «A») Как я могу генерировать индекс для всех 3-х колонок

Я также заметил эту линию в ptdump -.? кажется, беспокоит то, что у меня есть «non_index_axes» для предметов, которые я хотел бы указать: non_index_axes := [(1, ['A', 'B', 'C'])]

Если вы не можете создать индекс в пандах, я бы посоветовал, как это сделать прямо в pytables. (Например, мне нужно сначала удалить все существующие индексы и как изменить «non_index_axes» и «data_coumns»?)

Edit: Предвосхищая вопросы о моем прецеденте, вот большая картина того, что я 'm пытается выполнить:

  1. Читайте в 120 ГБ данных из файлов CSV. Каждый файл представляет собой один день финансовых данных и состоит из 100 000 строк, из которых около десятка столбцов в строке. Я просто сохраняю каждую строку, последовательно, в файле HDF5. Я бы хотел, чтобы эта начальная фаза работала быстро, поэтому я отключил индексирование. В настоящее время я читаю и разбираю каждый файл CSV за 6 секунд, а хранение в файл HDF5, как указано выше, занимает всего 1,5 секунды.

  2. Индекс небольшой (не всех) столбцов для поддержки множества запросов, таких как получение всех элементов с заданной строкой в ​​столбце 1 и датой из столбца 2 в определенном диапазоне.

  3. С течением времени каждый день я буду разбирать новый файл CSV и добавлять его в файл HDF5. Я ожидаю, что индексы будут продолжать обновляться.

  4. (В зависимости от моих шаблонов доступа порядок, в котором хранятся строки (в настоящее время, по дате), может оставаться лучшим вариантом для извлечения. Мне также может понадобиться сортировать по другому столбцу в большинстве запросов, в этом случае я думаю, что я должен был бы повторно сортировать таблицу после каждого файла CSV обрабатывается и добавляется.)

в настоящее время я застрял на шаге 2, генерируя индексы столбцов.

ответ

1

я сделаю это немного по-другому - take a look at this small example:

for chunk in ... # reading data in chunks: 
    # specify `data_columns`, but don't index (`index=False`) 
    hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False) 

# index columns explicitly  
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full') 
+0

Спасибо - да, я нашел этот индекс = False синтаксис после того как я уже сформирован файл, так что это здорово знать. Тем не менее, кажется, что в идеале я мог бы исправить существующий файл - «data_columns» не установлены в файле HDF ... не так ли? – eraoul