PyTables против скорости вставки SQLite3 - PullRequest
12 голосов
/ 21 мая 2011

Я купил данные об акциях Kibot, и они огромны.У меня есть около 125 000 000 строк для загрузки (1000 акций * 125 тыс. Строк / акция [данные бара за 1 минуту с 2010-01-01), каждая акция в CSV-файле, чьи поля: дата, время, открытие, максимум, минимум, закрытие,Объем).Я совершенно новичок в Python (я выбрал его, потому что он бесплатный и хорошо поддерживается сообществом), и я выбрал SQLite для хранения данных, потому что Python имеет встроенную поддержку.(И я очень хорошо знаю язык SQL. SQLiteStudio - жемчужина бесплатной программы.)

Моя программа-загрузчик работает хорошо, но работает медленнее.БД SQLite составляет около 6 ГБ и загружена только наполовину.Я получаю около 500 тыс. Строк в час с использованием операторов INSERT и фиксирую транзакцию после каждой акции (около 125 тыс. Строк).

Итак, вот вопрос: - это PyTables значительно быстрее, чем SQLite ,прилагая усилия, чтобы узнать, как это стоит?(И поскольку я нахожусь в режиме обучения, не стесняйтесь предлагать альтернативы этим двум.) Одна вещь, которая беспокоит меня о PyTables, заключается в том, что это действительно голые кости, почти как сохранение двоичного файла для бесплатной версии.Никаких функций «где предложение» или индексации нет, поэтому вы начинаете сканировать нужные вам строки.

После загрузки данных я собираюсь провести статистический анализ (регрессия, корреляция и т. Д.)используя что-то на основе NumPy: Timeseries, larry, pandas или scikit.Я еще не выбрал пакет анализа, поэтому, если у вас есть рекомендация, и эту рекомендацию лучше всего использовать либо с PyTables, либо с пандами (или чем-то еще), укажите это в своем ответе.

(Для @Джон) Python 2.6;
32-разрядная версия Windows XP SP3;
Изготовленные строки, используемые в качестве операторов INSERT;
Использование памяти стабильно на 750M физической памяти 2G;
Загрузка ЦП составляет 10% +/ - 5%;
Полная привязка ввода / вывода (диск всегда хрустит).
Схема БД:

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
);

Ответы [ 2 ]

10 голосов
/ 20 июня 2011
  1. Еще в 2003 году научная статья о сравнении PyTables и Sqlite была написана Ф. Альтеком, автором PyTables.Это показывает, что PyTables обычно быстрее, но не всегда.

  2. С вашей точки зрения, что PyTables чувствует себя «голыми», я бы сказал, что H5py - это простой способ доступа к HDF5 в pythonPyTables предоставляет все виды дополнительных вещей, таких как запросы и индексация, которых у HDF5 изначально нет.

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

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

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

4 голосов
/ 25 мая 2011

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

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

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

  3. «Изготовленные строки, используемые как операторы INSERT» или любые другие операторы SQL - плохая идея, как в отношении скорости, так и в плане безопасности (google («Атака SQL-инъекцией»)). Выйти из привычки сейчас. Используйте параметризованные операторы SQL.

...