Скорость загрузки PyTables и SQLite3
Я купил данные о запасах Kibot, и он огромен. У меня есть около 125 000 000 строк для загрузки (1000 акций * 125 тыс. Строк/запасов [данные за 1 минуту бара с 2010-01-01], каждый запас в файле CSV, полями которого являются дата, время, открытая, высокая, низкая, Объем). Я совершенно не знаком с python (я выбрал его, потому что он бесплатный и хорошо поддерживается сообществом), и я выбрал SQLite для хранения данных из-за встроенной поддержки python. (И я знаю язык SQL очень хорошо. SQLiteStudio - это драгоценный камень бесплатной программы.)
Моя программа загрузчика работает хорошо, но работает медленнее. SQLite db составляет около 6 Гб, и он загружен только на полпути. Я получаю около 500 тыс. Строк в час с использованием инструкций INSERT и совершая транзакцию после каждого запаса (приблизительно 125 тыс. Строк).
Итак, вот вопрос: - это PyTables значительно быстрее, чем SQLite, прилагая усилия, чтобы узнать, как его использовать? (И так как я в режиме обучения, не стесняйтесь предлагать альтернативы этим двум.) Одна вещь, которая беспокоит меня о PyTables, заключается в том, что она действительно содержит кости, почти как сохранение двоичного файла, для бесплатной версии. Нет функции "where clause" или индексации, поэтому вы завершаете сканирование требуемых строк.
После загрузки данных я собираюсь делать статистический анализ (скользящий регрессионный анализ и корреляцию и т.д.), используя что-то, основанное на NumPy: Timeseries, larry, pandas или scikit. Я еще не выбрал пакет анализа, поэтому, если у вас есть рекомендация, и эта рекомендация лучше всего использовать с PyTables или pandas (или что-то еще), пожалуйста, укажите это в ответ.
(Для @John)
Python 2.6,
Windows XP SP3 32-бит,
Производные строки, используемые в качестве инструкций INSERT.
Использование памяти - твердое тело на 750 М от физической памяти 2G,
Использование ЦП составляет 10% +/- 5%;
Полностью i/o bound (диск всегда хруст).
Схема БД:
create table MinuteBarPrices (
SopDate smalldatetime not null,
Ticker char( 5 ) not null,
Open real,
High real,
Low real,
Close real not null,
Volume int,
primary key ( SopDate, Ticker )
);
create unique index MinuteBarPrices_IE1 on MinuteBarPrices (
Ticker,
SopDate
);
Ответы
Ответ 1
Предложения:
-
У вас есть 1 ГБ памяти, которая не используется. Попробуйте использовать cache_size pragma - docs здесь. Другие интересующие нас прагмы: synchronous
и page_size
... может быть, слишком поздно для последнего.
-
Иногда быстрее загружать базовую таблицу без какого-либо индекса (ов), а затем создавать индекс (ы).
-
"Произведенные строки, используемые в качестве инструкций INSERT" или любые другие SQL-инструкции, являются плохой идеей, как с точки зрения скорости, так и с точки зрения безопасности (google ( "SQL injection attack" )). Убирайся из привычки. Используйте параметризованные операторы SQL.
Ответ 2
-
Еще в 2003 году научная статья о сравнении PyTables и Sqlite была написана Ф. Альтеком, автором PyTables, Это показывает, что PyTables обычно быстрее, но не всегда.
-
По вашему мнению, что PyTables чувствует "голые кости", я бы сказал, что H5py - это простой способ доступа к HDF5 в python, PyTables предлагает всевозможные дополнительные материалы, такие как запрос и индексирование, которые HDF5 не использует, t изначально имеют.
Пример запроса:
example_table = h5file.root.spamfolder.hamtable
somendarray = hamtable.readWhere('(gender = "male") & (age>40)')
Обратите внимание, что PyTables PRO, который имеет даже более благоприятные варианты, только прекратил свое существование, версия Pro теперь будет бесплатной. Это означает, что есть дополнительные опции для воспроизведения.