Кажется, у Python есть много возможностей для взаимодействия с SQLite (sqlite3, atpy) и HDF5 (h5py, pyTables). Интересно, есть ли у кого-нибудь опыт использования этих данных вместе с массивами numpy или таблицами данных (структурированные/записываемые массивы), и какие из них наиболее легко интегрируются с "научными" модулями (numpy, scipy) для каждого формата данных (SQLite и HDF5).
Экспорт из/импорта в numpy, scipy в форматах SQLite и HDF5
Ответ 1
Большая часть этого зависит от вашего варианта использования.
У меня гораздо больше опыта работы с различными методами на основе HDF5, чем с традиционными реляционными базами данных, поэтому я не могу слишком много комментировать SQLite-библиотеки для python...
По крайней мере, до h5py
vs pyTables
, они оба обеспечивают очень простой доступ через массивы numpy, но они ориентированы на очень разные варианты использования.
Если у вас есть n-мерные данные, для которых вы хотите быстро получить доступ к произвольному фрагменту на основе индекса, тогда гораздо проще использовать h5py
. Если у вас есть данные, похожие на таблицы, и вы хотите его запросить, то pyTables
- гораздо лучший вариант.
h5py
является относительно "vanilla" оберткой вокруг библиотек HDF5 по сравнению с pyTables
. Это очень хорошо, если вы собираетесь регулярно обращаться к своему файлу HDF с другого языка (pyTables
добавляет некоторые дополнительные метаданные). h5py
может многое сделать, но для некоторых случаев использования (например, что делает pyTables
) вам нужно будет потратить больше времени на настройку.
pyTables
имеет некоторые действительно приятные функции. Однако, если ваши данные не очень похожи на таблицу, то это, вероятно, не самый лучший вариант.
Чтобы дать более конкретный пример, я много работаю с довольно большими (десятками ГБ) 3 и 4-мерными массивами данных. Они представляют собой однородные массивы поплавков, ints, uint8 и т.д. Обычно я хочу получить доступ к небольшому подмножеству всего набора данных. h5py
делает это очень простым и делает довольно хорошую работу по автоматическому угадыванию разумного размера блока. Захват произвольного фрагмента или фрагмента с диска намного, намного быстрее, чем для простого файла memmapped. (Акцент на произвольный... Очевидно, что если вы хотите захватить весь фрагмент "X", тогда C-упорядоченный memmapped массив невозможно бить, так как все данные в "X" фрагменте смежны на диске.)
В качестве встречного примера моя жена собирает данные из широкого спектра датчиков, которые отсчитывают от минут до второго интервала в течение нескольких лет. Ей нужно хранить и запускать произвольные запросы (и относительно простые вычисления) по ее данным. pyTables
делает этот случай использования очень простым и быстрым и все еще имеет некоторые преимущества перед традиционными реляционными базами данных. (В частности, с точки зрения использования диска и скорости, с которой в памяти может считываться большой (индексный) фрагмент данных)