HDF5 с Python, Pandas: повреждение данных и ошибки чтения
Поэтому я пытаюсь хранить Pandas DataFrames в HDF5 и получаю странные ошибки, довольно непоследовательно. По крайней мере, половину времени некоторая часть цикла чтения-процесса-перемещения-записи завершается неудачно, часто без более четкого объяснения, чем "Ошибка чтения HDF5". Хуже того, иногда таблица заканчивается бессмысленными / испорченными данными, которые не останавливают вещи до нисходящего потока - либо значения, которые отклоняются на порядки (и даже не соотносятся с правильными), либо даты, которые не имеют смысла (последние данные ошибочно отмечены как датированные 1750-ми годами... и т. д.).
Я думал, что пройду текущий процесс, и тогда вещи, которые, как я подозреваю, могут вызвать проблемы, могут помочь. Вот как это выглядит:
- Прочитайте некоторые из таблиц (назовите их "QUERY1" и "QUERY2"), чтобы увидеть, обновлены ли они, а если нет,
- Возьмите таблицу, которая была в хранилище HDF5, как "QUERY1" и вместо этого сохраните ее как QUERY1_YYYY_MM_DD"в хранилище HDF5.
- Запустите связанный запрос к внешней базе данных для этой таблицы. Каждый из них содержит от 100 до 1500 столбцов ежедневных данных, относящихся к 1980 году.
- Сохраните результат запроса 1 как новый "QUERY1" в хранилище HDF5.
- Вычислить несколько преобразований одного или нескольких из QUERY1, QUERY2,...QUERYn, которые будут иметь иерархические (Pandas MultiIndex) столбцы. Перезаписать элемент "Derived_Frame1"... и т. Д. С его обновлением / заменой в магазине HDF5
- Несколько человек, имеющих доступ к соответствующему файлу.h5 на сетевом диске Windows, запускают эту процедуру - возможно, иногда, но не обычно, одновременно.
Некоторые вещи, которые я подозреваю, могут быть частью проблемы:
используя формат по умолчанию (
df.to_hdf(store, key)
) вместо того, чтобы настаивать на формате "Таблица" сdf.to_hdf(store, key, format='table')
). Я делаю это, потому что формат по умолчанию в 2–5 раз быстрее как для чтения, так и для записи в соответствии с% timeitИспользование сетевого диска, чтобы несколько пользователей могли запустить эту процедуру и получить доступ по крайней мере к производным кадрам. Я мало что могу сделать с этим требованием, особенно для доступа на чтение к производным фреймам данных в любое время.
Из документации кажется, что многократное удаление и перезапись элемента в хранилище HDF5 может привести к странным вещам (по крайней мере, постепенно увеличивая размер файла, не зная, что еще). Может быть, я должен хранить архивы запросов в другом файле? Может быть, я должен уничтожить и заменить весь основной файл после обновления?
Хранение фреймов данных со столбцами MultiIndex в HDF5, в первую очередь - это то, что заставляет меня получать "предупреждение" в формате по умолчанию, хотя кажется, что предупреждение исчезает, если я использую
format='table'
,Редактировать: также возможно / вероятно, что разные пользователи, выполняющие описанную выше процедуру, используют разные версии Pandas и разные версии PyTables.
Есть идеи?