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

Является ли бесперебойный сон причиной того, что моя программа Python работает очень медленно (и если да, то как я могу это решить?)?

У меня есть следующий оператор select (используя sqlite3 и модуль pysqlite):

self.cursor.execute("SELECT precursor_id FROM MSMS_precursor "+
  "JOIN spectrum ON spectrum_id = spectrum_spectrum_id "+
  "WHERE spectrum_id = spectrum_spectrum_id "+
  "AND ROUND(ion_mz,9) = ? AND ROUND(scan_start_time,4) = ? "+
  "AND msrun_msrun_id = ?", select_inputValues)

Для работы в Python требуется 55 секунд. При запуске непосредственно в командной строке SQLite требуется всего 15 мс. Теперь я заметил, что когда на этом этапе программа Python переходит в непрерывный сон (31283 ndeklein 18 0 126m 24m 3192 D 1.0 0.0 2:02.50 python, The D в верхнем выпуске), и она опускается с 100% до 1% CPU. Теперь, когда я заметил это во время этого запроса, я также посмотрел на верхний вывод при запуске запроса, который я спросил о здесь. В это время верхний также показывает, что он переходит в непрерывный сон, хотя он переключается между R и D и только замедляется примерно до 50% (он колеблется в зависимости от того, находится ли он в статусе D или R).

Итак, теперь я думаю, что это то, что замедляет мой запрос (пожалуйста, поправьте меня, если непрерывный сон не имеет ничего общего с скоростью программ). Если это так, как я могу убедиться, что программа не переходит в этот статус?


Обновление 1:

ПЛАН ПО ЭКСПЛУАТАЦИИ QUPLY PLAN с использованием Python возвращен:

(0, 0, 1, u'SCAN TABLE spectrum (~50000 rows)')

ПЛАН ПО ЭКСПЛУАТАЦИИ QUPLY с использованием командной строки sqlite:

0|0|1|SCAN TABLE spectrum (~50000 rows)
0|1|0|SEARCH TABLE MSMS_precursor USING INDEX fk_MSMS_precursor_spectrum_spectrum_id_1 (spectrum_spectrum_id=?) (~2 rows)

Возврат EXPLAIN с использованием Python:

(0, u'Trace', 0, 0, 0, u'', u'00', None)

EXPLAIN с использованием sqlite возвращен:

0|Trace|0|0|0||00|
1|Real|0|1|0|438.718658447|00|
2|Real|0|2|0|692.6345000000001|00|
3|Integer|1|3|0||00|
4|Goto|0|39|0||00|
5|OpenRead|1|33|0|13|00|
6|OpenRead|0|39|0|5|00|
7|OpenRead|2|41|0|keyinfo(1,BINARY)|00|
8|Rewind|1|35|0||00|
9|Column|1|8|5||00|
10|RealAffinity|5|0|0||00|
11|Integer|4|6|0||00|
12|Function|2|5|4|round(2)|02|
13|Ne|2|34|4||6a|
14|Column|1|12|4||00|
15|Ne|3|34|4|collseq(BINARY)|6c|
16|Column|1|0|8||00|
17|IsNull|8|34|0||00|
18|Affinity|8|1|0|d|00|
19|SeekGe|2|34|8|1|00|
20|IdxGE|2|34|8|1|01|
21|IdxRowid|2|7|0||00|
22|Seek|0|7|0||00|
23|Column|1|0|9||00|
24|Column|2|0|10||00|
25|Ne|10|33|9|collseq(BINARY)|6b|
26|Column|0|1|5||00|
27|RealAffinity|5|0|0||00|
28|Integer|9|6|0||00|
29|Function|2|5|11|round(2)|02|
30|Ne|1|33|11||6a|
31|Column|0|0|13||00|
32|ResultRow|13|1|0||00|
33|Next|2|20|0||00|
34|Next|1|9|0||01|
35|Close|1|0|0||00|
36|Close|0|0|0||00|
37|Close|2|0|0||00|
38|Halt|0|0|0||00|
39|Transaction|0|0|0||00|
40|VerifyCookie|0|31|0||00|
41|TableLock|0|33|0|spectrum|00|
42|TableLock|0|39|0|MSMS_precursor|00|
43|Goto|0|5|0||00|

И вернулся iostat:

io-bash-3.2$ iostat
Linux 2.6.18-194.26.1.el5 (ningal.cluster.lifesci.ac.uk)         06/04/2012

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           14.35    0.00    0.30    0.01    0.00   85.34

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               1.16         4.55        17.22    1520566    5752802
sda1              0.00         0.02         0.00       5074         34
sda2              1.16         4.53        17.22    1515184    5752768
sdb               0.00         0.02         0.00       5108          0
dm-0              2.29         3.88        16.70    1297226    5579336
dm-1              0.00         0.00         0.00        928          0
dm-2              0.11         0.65         0.52     216106     173432

Обновление 2

Я перенес базу данных в MySQL, и здесь запрос занимает всего около 0,001 секунды, хотя для всех остальных запросов я делаю это на самом деле медленнее, чем sqlite (я оптимизирован для sqlite, чтобы это могло или не было удивительно).

4b9b3361

Ответ 1

Как я уже говорил в ответе на предыдущий вопрос, который вы задали, вы предложили sqlite-модуль попробовать? С веб-сайта:

APSW - это оболочка Python для встроенной реляционной базы данных SQLite двигатель. В отличие от других оберток, таких как pysqlite, он фокусируется на будучи минимальным уровнем над SQLite, пытающимся просто перевести полный API SQLite в Python. В документации есть раздел, посвященный различия между APSW и pysqlite.

Я попробовал это сам, и, похоже, он действительно лучше отражает, как SQL-выражения выполняются "реальным" Sqlite (то есть клиентом или библиотекой C).

Ответ 2

Существует проблема с производительностью с SQLite и Python. Прочтите эту тему для получения дополнительной информации. Есть несколько предложений - попробуйте их, это может сработать - например, добавление индекса в ваши поля соединения или использование pysqlite.

http://www.mail-archive.com/[email protected]/msg253067.html