首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不间断睡眠是不是我的Python程序真的很慢的原因(如果是的话,我该如何解决这个问题?)

不间断睡眠是不是我的Python程序真的很慢的原因(如果是的话,我该如何解决这个问题?)
EN

Stack Overflow用户
提问于 2012-06-02 01:27:55
回答 2查看 1.5K关注 0票数 16

我有以下select语句(使用sqlite3和pysqlite模块):

代码语言:javascript
复制
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命令行上运行它时,只需要15ms。现在,我注意到,当它在这一步中,Python程序进入不间断睡眠(31283 ndeklein 18 0 126m 24m 3192 D 1.0 0.0 2:02.50 python,顶部输出中的D),它从100% CPU下降到大约1% CPU。现在,我在这个查询中注意到了这一点,在运行我询问的关于here的查询时,我还查看了顶部的输出。在这段时间里,top还显示它进入了不间断的睡眠状态,尽管它在R和D之间来回切换,并且仅减慢到50%左右(它的波动取决于它是处于D状态还是R状态)。

所以现在我认为这就是我的查询速度变慢的原因(如果不间断的睡眠与程序速度无关,请纠正我)。如果这是真的,我如何确保程序不会进入此状态?

更新1:

使用Python的解释查询计划返回:

代码语言:javascript
复制
(0, 0, 1, u'SCAN TABLE spectrum (~50000 rows)')

使用sqlite命令行的解释查询计划返回:

代码语言:javascript
复制
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)

使用Python的解释返回:

代码语言:javascript
复制
(0, u'Trace', 0, 0, 0, u'', u'00', None)

EXPLAIN using sqlite返回:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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进行了优化,所以这可能会令人惊讶,也可能不会令人惊讶)。

EN

回答 2

Stack Overflow用户

发布于 2012-06-10 01:15:45

正如我在an answer to a prior question you asked中提到的,您尝试过sqlite模块apsw吗?From the website

Python是用于SQLite嵌入式关系数据库引擎的

包装器。与其他包装器(如pysqlite )不同,它专注于成为SQLite上的最小层,仅尝试将完整的Python转换为SQLite。文档中有一节介绍了APSW和pysqlite之间的区别。

我自己尝试过,它似乎确实更好地反映了SQL语句是如何由“真正的”Sqlite (即客户端或C库)执行的。

票数 2
EN

Stack Overflow用户

发布于 2012-06-05 23:45:07

SQLite和Python存在性能问题。请阅读此帖子以了解更多信息。这里有一些建议-尝试一下,它可能会起作用-比如向连接字段添加索引或使用pysqlite。

http://www.mail-archive.com/python-list@python.org/msg253067.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10854817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档