【问题标题】:Python Memory Error (Unix vs Windows)Python 内存错误(Unix 与 Windows)
【发布时间】:2011-11-25 09:41:01
【问题描述】:

我正在开发一个加载大型 JPEG2000 图像并将它们转换为 TIF 的应用程序。稍后,它会提取像素数据并进行一些处理。它完美地工作,除了在一种情况下:

当我加载最大的图像并提取数据(10956x10956 数组)时,程序会崩溃,但它只会在 Windows 上崩溃——从不在 Linux 上崩溃。 (我想要一个可移植的应用程序)。

我检测到了问题,这是因为在将 20x20 插值到图像采样时出现内存错误。

f=RectBivariateSpline(x,y,Sun_angles)

xnew = numpy.linspace(x.min(),x.max(),rows)

ynew = numpy.linspace(y.min(),y.max(),columns)

Sun_angles_new = f(xnew, ynew) #here it crashes

我也尝试了interp2dmapcoordinates,得到了相同的结果。

Python 应该是完全可移植的,但我的印象是针对 Unix 系统进行了优化(另请参阅:Running python on a Windows machine vs Linux

注意:我在两台不同的计算机上运行该程序,但使用相同的处理器和 RAM。

因此...可能是什么原因?还有其他内存消耗更少的插值吗?

注意:一种解决方案是将图像分割成图块并进行插值。

【问题讨论】:

  • 每个操作系统是哪种架构(32 位和 64 位)?
  • 我再次检查,内存是一样的,但处理器不同。在 Windows 中它是 Core2Duo 32 位,在 linux 中是 Intel i5 64 位......对不起。
  • 可能是指令集不同或者其他原因,但是动态内存还是一样的......
  • 所有 Core 2 CPU 都是 64 位的,但这并不意味着什么。在 Windows 中,您可以通过查看计算机属性窗口中的“系统类型”条目来检查实际运行的体系结构(右键单击开始菜单中的“计算机”)。在 Linux 上,您可以运行getconf LONG_BIT,它将打印3264

标签: python linux memory


【解决方案1】:

您应该检查 Windows 下应用程序的内存使用情况。考虑到如果您为每个像素分配内存,原始图像的大小将约为 360MB(假设是 24 位图像),这将成倍增加,并且很容易超过 32 位地址空间的内存需求(您是Windows 应用程序限制为 ~2GB)

在 linux 上,您可能正在运行 64 位 linux,它正在运行 64 位版本的 python。桌面应用程序几乎无法达到这个限制(在地址空间用完之前,您将用完交换空间)。

【讨论】:

  • 是的,图像很大,但没有那么多(~250M,因为它是用 12 位编码的)。你是对的,当我达到 2.32M 时,程序显示内存错误。我试图分割图像,分段插值......但它没用。最后,我需要将所有部分合二为一,然后它再次崩溃....
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2012-10-31
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多