5

我正在使用 Delphi 开发记录器/嗅探器。在操作期间,我获得了大量数据,在压力操作期间可以累积到大约 3 GB 的数据。在某些计算机上,当我们达到这些级别时,应用程序会停止运行,有时还会引发异常。

目前我正在使用 GetMem 函数将指针分配给每条消息。

有没有更好的方法来分配内存,这样我就可以最大限度地减少失败的机会?请记住,我不能将大小限制为硬限制。

您如何看待使用 HeapAlloc、VirtualAlloc 甚至映射文件?哪个会更好?

谢谢你。

4

1 回答 1

5

您的基本问题是 32 位进程的 4GB 硬地址空间限制。由于您在 3GB 上遇到问题,我只能假设您正在使用/LARGEADDRESSAWARE/3GB 启动开关在 64 位 Windows 或 32 位 Windows 上运行。

我认为您有几种选择,包括但不限于以下几种:

  1. 使用更少的内存。也许您可以处理较小的块或将一些内存推送到磁盘。
  2. 使用 64 位 Delphi(刚刚发布)或 FreePascal。这使您摆脱了地址空间限制,但将您限制在 64 位版本的 Windows 上。
  3. 使用内存映射文件。在具有大量内存的机器上,这是访问操作系统内存缓存的一种方式。内存映射文件不适合胆小的人。

由于我不了解您的架构,因此我无法就解决方案给出明确的建议,但根据我的经验,减少内存占用通常是最好的解决方案。

使用不同的分配器可能没有什么不同。是的,确实存在低碎片分配器,但它们肯定不会真正解决您的问题。他们所能做的就是稍微降低它出现的可能性。

于 2011-09-12T18:40:40.840 回答