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

  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • 获取 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