Подтвердить что ты не робот

Скорость загрузки 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
);
4b9b3361

Ответ 1

Предложения:

  • У вас есть 1 ГБ памяти, которая не используется. Попробуйте использовать cache_size pragma - docs здесь. Другие интересующие нас прагмы: synchronous и page_size... может быть, слишком поздно для последнего.

  • Иногда быстрее загружать базовую таблицу без какого-либо индекса (ов), а затем создавать индекс (ы).

  • "Произведенные строки, используемые в качестве инструкций INSERT" или любые другие SQL-инструкции, являются плохой идеей, как с точки зрения скорости, так и с точки зрения безопасности (google ( "SQL injection attack" )). Убирайся из привычки. Используйте параметризованные операторы SQL.

Ответ 2

Пример запроса:

 example_table = h5file.root.spamfolder.hamtable
 somendarray = hamtable.readWhere('(gender = "male") & (age>40)')

Обратите внимание, что PyTables PRO, который имеет даже более благоприятные варианты, только прекратил свое существование, версия Pro теперь будет бесплатной. Это означает, что есть дополнительные опции для воспроизведения.