不间断睡眠是否是我的Python程序运行速度非常慢的原因(如果是这样,我该如何解决这个问题?)?

2024-03-14

我有以下 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,顶部输出中的 D),它从 100% CPU 下降到大约 1% CPU。现在我在这个查询期间注意到了它,我还在运行我询问的查询时查看了顶部输出here https://stackoverflow.com/questions/10531898/why-is-the-same-sqlite-query-being-30-times-slower-when-fetching-only-twice-as-m。在此期间,top 还显示它进入不间断的睡眠状态,尽管它在 R 和 D 之间来回切换,并且仅减慢到 50% 左右(它的波动取决于它是否处于 D 或 R 状态)。

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


更新1:

使用 Python 的 EXPLAIN QUERY PLAN 返回:

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

使用 sqlite 命令行的 EXPLAIN QUERY PLAN 返回:

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 的 EXPLAIN 返回:

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

使用 sqlite 的 EXPLAIN 返回:

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

Update 2

我将数据库迁移到MySQL,这里查询只需要大约0.001秒, 即使对于我正在执行的所有其他查询,它实际上比 sqlite 慢(我针对 sqlite 进行了优化,因此这可能会或可能不会令人惊讶)。


正如我在对您之前提出的问题的回答 https://stackoverflow.com/questions/10412604/how-can-i-speed-up-fetching-the-results-after-running-an-sqlite-query,您尝试过 sqlite 模块 apsw 吗?来自网站 http://code.google.com/p/apsw/:

APSW 是 SQLite 嵌入式关系数据库的 Python 包装器 引擎。与其他包装器(例如 pysqlite)相比,它专注于 作为 SQLite 上的一个最小层,试图转换 完整的 SQLite API 到 Python 中。该文档有一节关于 APSW 和 pysqlite 之间的区别。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不间断睡眠是否是我的Python程序运行速度非常慢的原因(如果是这样,我该如何解决这个问题?)? 的相关文章

随机推荐

  • 获取 magento 商店列表

    如何获取 Magento 网站下的商店组列表 然后获取该商店组中的商店列表 尝试这样直接获取对象 Mage app gt getWebsites lt in file gt app code core Mage Core Model App
  • iOS 5、xcode 4.2、故事板中的主页按钮

    iOS 5 0 代码 4 2 我正在做一份多步骤调查问卷 每个分支大约有10个问题 并且还有子分支 但逻辑是相当线性的 大多数是 否答案 但也有一些多选选项 调查问卷将得出结论页 在此结论页面上 我想要一个显示 HOME 的按钮 这会将用户
  • 作为本地化字符串的字符串常量

    我想本地化我的常量 常量按通常的方式定义和声明 extern NSString const kStringName NSString const kStringName Whatever 如何使其可本地化 这根本行不通 NString co
  • NOCHECK 不禁用外键引用

    表创建脚本 CREATE TABLE dbo details id int NULL details varchar max NULL CREATE TABLE dbo name id int IDENTITY 1 1 NOT FOR RE
  • 如何自动更新 Subversion 工作副本?

    有谁知道我如何自动运行svn update 如果有人有脚本或类似的东西 你能给我举个例子吗 我正在使用 TortoiseSVN 在生产服务器上 我有一个运行以下批处理文件的计划任务 CD C Program Files TortoiseSV
  • 如何查看 Git 存储中未跟踪的文件

    我经常将我完成的工作隐藏在新的 未跟踪的 文件中 并且我希望以后能够找到这项工作 找到它的明显方法似乎是git show 我刚刚发现Git在我使用时完全省略了这些文件git show 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可
  • 在 FFmpeg 中正确分配和填充帧

    我正在填写一个Frame使用 BGR 图像进行编码 但出现内存泄漏 我想我找到了问题的根源 但它似乎是一个库问题 由于 FFmpeg 是一个如此成熟的库 我认为我误用了它 我希望得到指导如何正确地使用它 我正在分配一个Frame using
  • JasperReports 中的印地语字体 [重复]

    这个问题在这里已经有答案了 在印地语字体的内部预览中正确显示 但在 PDF 中情况有所不同 例如 在 Pdf 中显示 怎么解决这个问题 一些字体类型 例如 Arial Unicode MS 将支持特殊字符 例如印地语符号 要解决此问题 请打
  • 如何使用汇编程序从英特尔处理器中获取随机数?

    我需要从处理器 英特尔酷睿 i3 中的英特尔随机生成器获取随机数 我不想使用任何图书馆 我想在 C 中使用汇编程序粘贴 但我不知道应该使用哪些寄存器和指令 呼叫RDRAND支持的 CPU 目前仅 Ivy Bridge 和 Haswell I
  • 如何使用OpenCV找出帧之间的差异?

    在 OpenCV 上运行视频时如何找到帧之间的差异 我需要做一个循环来检查帧与帧之间的更改并将结果显示在另一个窗口中 我可以在此处附加的循环中执行此操作吗 或者还有其他方法可以做到吗 while key x frame cvQueryFra
  • 手动调用 __enter__ 和 __exit__

    我用谷歌搜索过但没有运气 所以让我们想象一下我有MySQL使用的连接器类 enter and exit 函数 最初与with语句 来连接 断开与数据库的连接 让我们有一个使用其中 2 个连接的类 例如用于数据同步 注意 这不是我的现实生活场
  • 如何在 2020/21 年活动中获取 ViewModel 实例?

    我是 mvvm 模式的新手 我为主要活动创建了一个 ViewModel 现在我想在主活动中获取 ViewModel 的实例 Stackoverflow 上的大多数教程和答案都建议使用ViewModelProviders of 但这已被弃用
  • 无法使用 Httprequest 库将图像上传到服务器

    我创建了一个应用程序 用户在其中从图库中选择图像并将该图像上传到服务器 我尝试使用 Httprequest 库执行此操作 但我无法上传它 Code HttpRequest request HttpRequest post https bet
  • Flutter android 版本卡在启动屏幕上

    Flutter android 版本构建卡在启动屏幕上 我尝试过清理项目flutter clean 但它仍然卡在启动屏幕上 我也用过WidgetsFlutterBinding ensureInitialized 在执行之前runApp 它仍
  • 如何在不破坏 Subversion 历史记录的情况下重命名 Java 包?

    我工作的公司正在成立 他们在此过程中更改了名称 所以我们仍然使用包名称 com oldname 因为我们害怕破坏文件更改历史记录 或者版本之间的祖先链接 或者任何我们可能破坏的东西 我不认为我使用了正确的术语 但你明白了这个概念 我们使用
  • 从外部文件获取输入?

    我需要从 C 的外部文件中获取非常基本的输入 我尝试在互联网上搜索几次 但没有任何内容真正适合我的需要 这将是一个输入来自的 txt 文件 其中将填充如下行 131 241 371 481 我已经有代码可以手动获取此输入 它看起来像这样 u
  • GCMIntentService 的 Intent Extras 未传递

    I coded GCMIntentService但打电话Activity无法获得额外费用 Override protected void onMessage Context context Intent intent Intent resu
  • 信息窗口显示在错误的位置

    I have little problem with my webpage When I m trying to show InfoWindow on marker That windows shows on the top left co
  • Google FooBar 挑战显示 Blacklisted_Code 错误 [已关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我今天偶然发现了 Google Foo Bar 挑战 在解决非常简单的第一个问题时 gt 涉及创建字符串中所有素数的串联
  • 不间断睡眠是否是我的Python程序运行速度非常慢的原因(如果是这样,我该如何解决这个问题?)?

    我有以下 select 语句 使用 sqlite3 和 pysqlite 模块 self cursor execute SELECT precursor id FROM MSMS precursor JOIN spectrum ON spe