当前位置: 首页 > 知识库问答 >
问题:

Python OpenCV/Numpy内存分配错误——仅在两台机器中更好的一台上?

花永昌
2023-03-14

我有两台运行相同Python脚本的机器,它们使用OpenCV来转换图像文件格式。该脚本在我的低端笔记本电脑上运行良好,它有4 GB的内存。但是,在我的台式机上,它有32 GB,我收到以下错误:

OpenCV 错误: 无法创建 Numpy 分配器::分配, 文件 D:\Build\OpenCV-3.3.1\模块\python\src2\cv2.cpp,第 175 行 OpenCV 错误:内存不足(无法分配 243000000 字节),文件 D:\Build\OpenCV\openCV\opencv\3.3.1\模块\核心\src\alloc.cpp,第 55 行

(1)导致此错误的代码如下。脚本中没有其他代码使用OpenCV。

# png and jpg are filenames
img = cv2.imread(png)
cv2.imwrite(jpg, img, [cv2.IMWRITE_JPEG_QUALITY, 85])

(2)两台机器都在64位AMD CPU上运行Windows 10。

(3) 根据sys.maxsize,Python在这两台机器上都以32位模式运行。

(4)两台机器都在运行Python 3.6.2。我尝试将桌面更新到3.6.3,但没有任何区别。

(5)两台机器都有OpenCV版本3.3.1

(6)我遇到内存错误的台式机使用的是比笔记本电脑的1.13.1版本稍新的NumPy版本(1.13.3 ),而笔记本电脑的1 . 13 . 1版本一切正常。

(7) 该脚本将无错误地转换较小的图像,但会被9000 x 9000像素的PNG卡住。我意识到这并不小,但是,即使是这个大图像在笔记本上也很好。

我确实试图搜索任何可能表明NumPy 1.13.3已知会破坏东西的信息,因为这是我唯一能识别的差异,但我找不到任何表明这样一个问题的信息。

提前感谢任何可以帮助解释问题以及如何解决问题的人。

共有1个答案

齐振
2023-03-14

事实证明,我需要的所有包都有64位版本,所以我通过切换到64位Python设置来工作。

如果这对其他人有帮助,以下是我一路走来学到的东西:

由于我在一个32位的Python环境中工作,所以我的台式机上的大量RAM并不是很重要。在32位模式下,我不可能访问超过4GB的内存。在现实中,我甚至不能得到它,因为所有的东西都在争夺4GB的块,如果我理解正确的话,任何32位Python进程的分配都不会超过2GB。

使用Numpy,事情变得更糟,因为Numpy数组需要连续的内存块。这使得事情变得紧张,显然足够紧张,以至于我为图像所需的243 MB不可用。不一定需要内存泄漏才能出现此问题。如果情况很紧张,那么我使用pycairo执行的正常(可能有点内存密集型)绘图操作可能会为随后的图像转换留下太多。(Surface 对象尚未发布,因为它将在后续迭代中使用。

令人惊讶的是 - 至少对我来说 - 是可用于这2 GB最大操作的连续内存量可能因机器而异,甚至每天都会有很大差异,这取决于各种不明显的事情。看来我的笔记本只是碰巧有一些偶然的情况,留下了我243 MB的连续内存,而我的台式机却没有。

感谢那些提供建议的人。

 类似资料:
  • 问题内容: 我刚从python移植了我的应用程序,所以Go有点新。看来我遇到了记忆问题。 它在ubuntu机器上运行。通过主管。 编辑: 设置解决问题 问题答案: 对于遇到此问题的其他人,这是golang问题中的相关近期问题 对于所有受影响的人,在Linux上得到适当修复之前的临时替代方法可以是以下之一: 启用无条件过量使用: 能够无条件过载:添加交换到你的主机,用它几乎永远不会被使用,但在计算参

  • 我有一个。NET Core 3.1 C#应用程序,该应用程序通过HTTPS调用API(并将其公钥作为获取令牌的一部分,因为该证书稍后将用于解密单独发送回的信息)。在我们几乎所有的机器上,它都在工作,但是在一台Windows 8.1机器上,当我们尝试初始连接身份验证令牌时,我们会遇到以下一系列异常: 异常是从,因此我怀疑这是在HTTPS级别发生的,我们的证书内容在这里并不真正相关。 我们获取令牌的代

  • 我正在尝试运行下面的程序,在该程序中,我使用一个名为Reserve的函数动态地为变量分配内存。当我运行应用程序时,由于在一个单独的函数中为一个空指针分配内存,我会得到分段错误,但是如果我想在主函数中分配内存,我不会得到这个错误。那我做错了什么? 代码如下:

  • 问题内容: 我在本地计算机上为postgres创建了一个docker卷。 然后,我使用了该卷并运行了一个docker。 之后,我做了一些数据库操作,这些操作自动存储在postgres-data中。现在,我想将该卷从本地计算机复制到另一台远程计算机。怎么做一样。 注意-数据库大小非常大 问题答案: 如果第二台计算机启用了SSH,则可以在第一台计算机上使用Alpine容器来映射该卷,将其捆绑并发送到第

  • 问题内容: 我正在尝试在Ubuntu 14.04 VPS上运行npm install,但是在安装业力方面一直失败。当我以jenkins用户身份登录时,命令npm install从Jenkins构建步骤执行,但是从命令行也失败。Jenkins服务器通过Capistrano调用另一个VPS(生产服务器)上的部署,据我所知,该部署与第一个VPS完全一样。 奇怪的是,在生产服务器(第二个VPS)上部署后,

  • 问题内容: 如Docker文档中有关使用卷的文档中所述,存在所谓 的仅数据 容器的概念,该容器提供了可以安装到多个其他容器中的卷,无论该数据容器是否正在运行。 基本上,这听起来很棒。但是有一件事我不明白。 这些卷(由于可移植性原因, 未 明确映射到主机上的文件夹,如文档所述)由Docker在主机上的某个内部文件夹中创建和管理。 假设我使用了这样一个卷,然后需要将其从一台主机迁移到另一台主机-如何移