用于高容量记录器应用程序的分配方法是什么?

时间:2011-09-12 18:03:22

标签: delphi memory-management heap-memory high-volume getmem

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

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:5)

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

我认为您有一些选择,包括但不限于以下内容:

  1. 使用更少的内存。也许您可以处理较小的块或将一些内存推送到磁盘。
  2. 使用64位Delphi(刚刚发布)或FreePascal。这可以减轻地址空间限制,但会限制您使用64位版本的Windows。
  3. 使用内存映射文件。在具有大量内存的计算机上,这是一种访问OS内存缓存的方法。内存映射文件不适合胆小的人。
  4. 由于我不了解您的架构,我无法明确建议解决方案,但根据我的经验,减少内存占用通常是最佳解决方案。

    使用不同的分配器可能没什么区别。是的,确实存在低碎片分配器,但它们肯定不会真正解决您的问题。他们所能做的只是让它不太可能出现。