我正在使用Delphi开发一个记录器/嗅探器.在操作期间,我得到了大量的数据,这些数据可以在压力操作期间累积到大约3 GB的数据.
在某些计算机上,当我们到达这些级别时,应用程序停止运行,有时会抛出异常.
在某些计算机上,当我们到达这些级别时,应用程序停止运行,有时会抛出异常.
目前我正在使用GetMem函数来分配指向每条消息的指针.
是否有更好的方法来分配内存,以便最大限度地减少失败的可能性?请记住,我不能将大小限制为硬限制.
您如何看待使用HeapAlloc,VirtualAlloc甚至是映射文件?哪个更好?
谢谢.
解决方法
您的基本问题是32位进程的硬地址空间限制为4GB.由于您遇到的问题是3GB,我只能假设您使用/ LARGEADDRESSAWARE在64位
Windows或32位
Windows上运行/ 3GB启动开关.
我想你有几个选择,包括但不限于以下内容:
>使用更少的内存.也许您可以处理较小的块或将一些内存推送到磁盘.
>使用64位Delphi(刚刚发布)或FreePascal.这可以减轻地址空间约束,但会限制您使用64位版本的Windows.
>使用内存映射文件.在具有大量内存的计算机上,这是一种访问OS内存缓存的方法.内存映射文件不适合胆小的人.
由于我不了解您的架构,我无法明确建议解决方案,但根据我的经验,减少内存占用通常是最佳解决方案.
使用不同的分配器可能没什么区别.是的,确实存在低碎片分配器,但它们肯定不会真正解决您的问题.他们所能做的只是让它不太可能出现.