我编写了一个转换器,它采用 openstreetmap xml 文件并将它们转换为二进制运行时渲染格式,该格式通常约为原始大小的 10%。输入文件大小通常为 3GB 或更大。输入文件不会一次全部加载到内存中,而是以收集点和多边形的方式进行流式传输,然后对它们运行 bsp 并输出文件。最近,在较大的文件上,它会耗尽内存并死掉(有问题的文件有 1400 万个点和 100 万个多边形)。通常,当发生这种情况时,我的程序会使用大约 1GB 到 1.2GB 的 RAM。我尝试将虚拟内存从 2 GB 增加到 8 GB(在 XP 上),但此更改没有效果。另外,由于此代码是开源的,我希望它可以在 Windows、Linux 和 Mac 上运行,而不管可用的 ram 是什么(尽管速度较慢)。
我可以使用哪些技术来避免内存不足?以较小的子集处理数据,然后合并最终结果?使用我自己的虚拟内存类型的处理程序?还有其他想法吗?
首先,在 32 位系统上,无论页面文件设置如何,内存始终限制为 4 GB。 (其中,Windows 上的进程只能使用 2GB。在 Linux 上,通常有大约 3GB 可用)
因此,第一个明显的解决方案是切换到 64 位操作系统,并编译 64 位应用程序。这为您提供了巨大的虚拟内存空间可供使用,并且操作系统将根据需要将数据换入和换出页面文件以保持工作正常。
其次,一次分配较小的内存块可能会有所帮助。找到 4 256MB 的空闲内存块通常比找到 1GB 的空闲内存块更容易。
第三,分解问题。不要一次处理整个数据集,而尝试一次仅加载和处理一小部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)