2010-10-01 1 views
2

Как я уже говорил в вопросе this, у меня возникают проблемы с производительностью при доступе к базе данных sqlite из Python. Чтобы сделать это еще раз, идентичный код работает более чем в 20 раз быстрее, используя apsw. Недавно я установил другую версию Python параллельно и установил для нее новую версию apsw. Эта версия тоже замедлялась. Я попробовал тот же код на другом компьютере, используя pythons built-int sqlite3, и он быстро работал (но медленно с apsw). Я также попытался установить самую последнюю версию pysqlite на моем компьютере, но это было медленным.Как диагностировать причину для медленного доступа к базе данных sqlite?

Я абсолютно уверен, что это не проблема с схемой.

Вопрос теперь в том, как я могу приступить к диагностике ошибки?

ответ

1

На всякий случай, возможно, вы заметили это, убедитесь, что вы работаете с the latest versions of both the pysqlite2 data base adapter and the sqlite3 library. Связанный ответ также показывает, как точно определить, какую версию каждого из них вы используете, данные, которые вы можете добавить к своему вопросу.

+0

Я проверил это. Это последняя версия. При установке pysqlite вы можете фактически сказать, что он загружает и создает последнюю версию, что я и сделал. –

+2

Было бы полезно, если бы вы могли дать больше информации о том, какие платформы, в каких версиях python, какие версии pysqlite2, какие apsw-версии и какие версии sqlite3 вы используете где. В вашем вопросе так много движущихся целей, трудно знать, с чего начать. –

0

я могу предложить свой опыт на подобный опыт, но с другой платформы, а именно J.

Существовал некоторые медленность, и я точно определили его функции sqlite3_get_table. Эта функция возвращает указатель для каждого столбца, каждый из которых указывает на массив указателей, где каждый из них ссылается на строку с нулевым завершением. Указатели также могут быть нулевыми, если результат функции равен нулю (скажем, Max на пустом наборе данных, он вернет нулевой указатель, а не указатель на нуль. Я ненавижу это.) J затем сформировал адреса как читаемые (образуют большую матрицу адресов, за которой следует 0 для смещения и -1 для длины, что означает до первого нуля) и циклически проходит через каждую, чтобы окончательно переформатировать таблицу в ее предполагаемых столбцах и строках.

Итак, есть аспект передачи памяти, а также фактический аспект чтения, чтобы получать данные из SQLite на другую платформу. Я обнаружил, что этот частотный массив данных нелегко обрабатывается J, а это означает, что он неуклюж, как все строки. Плюс есть эта неприятная вещь с нулевым указателем.

Мне удалось ограничить модификации матрицы, чтобы оптимизировать функцию. Последняя оптимизация заключалась в использовании примитивного кода для чтения адреса памяти (15!:1) и не порядочно названной функции (memr), поскольку использование memr означало, что J должен был интерпретировать то, что memr означает в каждой памяти, прочитанной.

В заключение, если python допускает некоторые изменения, возможно, вы можете настроить доступ к базе данных для лучшего удовлетворения ваших потребностей. Я надеюсь, что это поможет, но у меня нет особых надежд ...

Смежные вопросы