экспорт из / импорт в numpy, scipy в форматах SQLite и HDF5

#python #sqlite #numpy #scipy #hdf5

#python #sqlite #numpy #scipy #hdf5

Вопрос:

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

Комментарии:

1. Вы спрашиваете о сохранении данных numpy в таблицах SQLite?

Ответ №1:

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

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

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

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

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

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

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

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

Комментарии:

1. Спасибо — это именно та информация, которую я искал в contrasting h5py и pyTables … но тогда это не обязательно то, что идет с NumPy, но хорошо сочетается с фактическими данными в массиве NumPy. Я опубликую эту SQLite часть как отдельный вопрос.

2. @JoeKington: Примечание: я не уверен, что «упорядоченный в C массив с отображением памяти невозможно превзойти»: копирование данных с помощью memcpy() может быть медленнее, чем передача сжатых данных и их распаковка, когда они поступают в процессор ( blosc.pytables.org/trac ). Конечным результатом является то, что обработка сжатых данных массива может быть быстрее, чем обработка несжатых данных массива.