我正在使用一个图像处理库,当我尝试加载大小 > 4GB 的图像时,该库会引发异常。它声称是 64 位,但是 64 位库不允许加载比这更大的图像吗?我认为他们使用 64 位内存模型/编译器重新编译了 C 库,但仍然使用无符号整数,并且无法升级到使用 64 位类型。

这是一个合理的结论吗?

编辑 - 事后想想,操作系统内存是否会变得如此碎片化,以至于不再可能分配大块?(重启后也不起作用,但只是想知道。)在.NET下怎么样?.NET 托管内存是否会变得如此碎片化以致于大块分配失败?

有帮助吗?

解决方案

这是一个合理的建议,但确切的原因可能是一些事情 - 例如,你运行的是什么操作系统,多少RAM /交换,你呢?应用程序/ OS可能不超过提交虚拟存储器所以需要4GB(或更多)的自由RAM以打开图像。

出于兴趣它似乎是在4GB的边界明确的停止 - 即没有一个3.99GB的图像成功,但4GB的一个失败 - 你说确实这将表明在库中明确使用32位的大小数据结构。

<强>更新

至于你的第二个问题 - 不是真的。几乎所有现代操作系统的使用虚拟内存,所以每个进程都有它自己的连续的地址空间。在一个进程的地址空间中的单个连续区域不需要由连续的物理RAM被备份,它可以由许多的RAM分离的物理区域做成看起来像他们是连续的;所以OS并不需要有自由RAM单条4GB块给你的应用程序4GB块。

这有可能是一个应用程序可以分段它的虚拟地址空间,使得没有足够的空间用于连续4GB的区域,但考虑到它可能是极不可能在64位的地址空间,在你的场景的大小。

其他提示

是,除非也许是二进制文件格式本身限制了图像的大小。

为了回答你的后续问题,我最近读到 文章并发现它很有趣。

是的,.NET 可能存在问题 内存碎片.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top