Python win32com内存不足错误
为了操作第三方设备,我使用python的Python win32com内存不足错误,python,winapi,com,win32com,Python,Winapi,Com,Win32com,为了操作第三方设备,我使用python的win32com模块与提供的UI交互。这通常按预期工作,但COM API很少(每10k左右调用一次)抛出错误-2147024888(0x80070008),说明没有足够的存储空间来处理此命令。这非常烦人,因为它通常会在夜间杀死设备,运行过程需要完全重复 现在的问题是,什么是内存不足,因为我肯定没有达到任何RAM限制。深入研究这个问题,我发现我也无法关闭和重新打开COM连接,因为这会导致错误-2147024882(0x8007000e)被描述为内存不足。然而
win32com
模块与提供的UI交互。这通常按预期工作,但COM API很少(每10k左右调用一次)抛出错误-2147024888
(0x80070008
),说明没有足够的存储空间来处理此命令。这非常烦人,因为它通常会在夜间杀死设备,运行过程需要完全重复
现在的问题是,什么是内存不足,因为我肯定没有达到任何RAM限制。深入研究这个问题,我发现我也无法关闭和重新打开COM连接,因为这会导致错误-2147024882
(0x8007000e
)被描述为内存不足。然而,答案暗示实际上不涉及记忆问题。作为另一种解释,建议使用过多的句柄
这一观点将得到观察的支持,即我现在不能再分叉线程了。在threading.Thread上调用start()
,我获得
RuntimeError: can't start new thread
尽管根据threading.active\u count()
只有4个线程在运行。同时,在运行python的另一个进程中没有发现这些问题。因此,我怀疑我的进程耗尽了一些资源,但我不知道是哪个资源。目前,我看到了两个关于如何进行的选择
- 选项1:找出我的进程正在运行的资源。然而,我并不是真正的调试专家。为了更好地了解幕后发生的事情,我可以尝试做些什么
- 选择2:接受问题并解决它。在这种情况下,错误捕获似乎不够。一旦出现错误,似乎无法在不中断python进程的情况下让所有内容重新工作。当然,这在python中是不可能的
作为一个解决方案,我考虑使用这个模块,让所有与设备相关的调用在一个单独的进程中运行。如果出现问题,我会从主程序中删除进程,然后重新启动,并可能在错误发生的地方继续
对于这两种选择,我很乐意提供建议或指导。也许还有一些完全不同的东西,我没有想过。感谢您的帮助
编辑:受Ben评论的启发,我查找了仍在运行的进程的一些属性,其中出现了错误。这里有一个数据列表,我认为它是有用的:
- 1.7G提交大小,仅使用21M和500M峰值内存(在Win7 x86上)
- 800k分页错误
- 772手柄
- 20线
使用任务管理器详细信息或流程选项卡,并启用可选列。其中一个是“句柄计数”,另一个是“线程计数”,另请参见“提交费用”,这是进程的内存分配。你很快就会看到你正在耗尽什么。性能监视器也会有帮助。谢谢你的建议。我做了一个编辑,包括数据,我认为可能是相关的。暂时我不知道。由于崩溃只发生在每10公里左右的通话中,我从未实时目睹过它,只是看到了整个程序被卡住的后果。我也没有明显的办法,如何重现这次崩溃。有什么想法吗?在我的测试之后,我无法画出一幅连贯的图画。今晚我确实看到了RAM使用率的持续增长,但今天再次运行完全相同的代码,我没有看到。所以我的解释是python的垃圾收集器今晚有点懒。此外,当我连接内存分析器时,我不会得到任何内存泄漏的提示。因此,很有可能,问题一定在别处。@tigertang我的问题中描述的问题已经不存在了,但我从未真正发现是什么让它消失了。然而,我相信根本原因是一个用错误类型初始化的变量。我已经写下了我对此的见解。我不能说这是否会以某种方式转化为您的子流程
。