экспорт из / импорт в numpy, scipy в форматах SQLite и HDF5 - PullRequest
12 голосов
/ 25 октября 2011

Похоже, у Python есть много вариантов взаимодействия с SQLite (sqlite3, atpy) и HDF5 (h5py, pyTables). Интересно, есть ли у кого-нибудь опыт использования их вместе с массивами numpy или таблицами данных (структурированные массивы / массивы записей)? и какие из них наиболее легко интегрируются с «научными» модулями (numpy, scipy) для каждого формата данных (SQLite и HDF5).

1 Ответ

23 голосов
/ 25 октября 2011

Большая часть зависит от вашего варианта использования.

У меня гораздо больше опыта работы с различными методами на основе HDF5, чем с традиционными реляционными базами данных, поэтому я не могу комментировать слишком много библиотек SQLite для python ...

По крайней мере, какЧто касается h5py против pyTables, они оба предлагают очень простой доступ через массивные массивы, но они ориентированы на очень разные варианты использования.

Если у вас есть n-мерные данные, к которым вы хотите быстро получить доступпроизвольный основанный на индексе фрагмент, тогда гораздо проще использовать h5py.Если у вас есть данные, которые больше похожи на таблицы, и вы хотите запросить их, тогда pyTables - гораздо лучший вариант.

h5py - относительно «ванильная» оболочка для библиотек HDF5 по сравнению с pyTables.Это очень хорошо, если вы собираетесь регулярно получать доступ к файлу HDF с другого языка (pyTables добавляет дополнительные метаданные).h5py может сделать лот , но для некоторых случаев использования (например, что делает pyTables) вам придется потратить больше времени на настройку вещей.

pyTables имеет некоторые действительно приятных функций.Однако, если ваши данные не очень похожи на таблицу, то это, вероятно, не лучший вариант.

Чтобы привести более конкретный пример, я много работаю с довольно большими (десятки ГБ) 3 и 4размерные массивы данных.Это однородные массивы чисел с плавающей точкой, целых, uint8 и т. Д. Я обычно хочу получить доступ к небольшому подмножеству всего набора данных.h5py делает это очень простым и делает довольно хорошую работу по автоматическому угадыванию разумного размера фрагмента.Захват произвольного фрагмента или фрагмента с диска намного, намного быстрее, чем для простого файла memmapped.(Акцент на произвольном ... Очевидно, что если вы хотите получить весь слайс "X", то C-упорядоченный массив memmapped невозможно превзойти, так как все данные в слайсе "X" смежны на диске.)

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

...