Tor*_*edo 5 memory delphi memory-management
我有一个 32 位 Delphi 应用程序,在 /LARGEADDRESSAWARE 标志上运行。这允许在 64 位系统上分配最多 4GB。
我使用线程(在池中)来处理文件,其中每个任务在内存中加载一个文件。当多个线程正在运行时(正在加载多个文件),在某些时候 EOutOfMemory 会击中我。
获取可用地址空间的正确方法是什么,以便我可以在处理下一个文件之前检查我是否有足够的内存?
就像是:
如果 TotalMemoryUsed {from GetMemoryManagerState} + FileSize < "AvailableUpToMaxAddressSpace" 然后 NoOutOfMemory
我试过使用
TMemoryStatusEx.ullAvailVirtual for AvailableUpToMaxAddressSpace
但结果不正确(有时为 0,有时> 比我实际拥有的值)。
我认为您不能合理且可靠地期望能够提前预测内存分配是否会失败。至少,您可能需要编写自己的内存分配器,专门为您的应用程序提供服务,并且对进程的堆分配要求有非常深入的了解。
实际上,最简单的方法就是摆脱 32 位地址空间的束缚。这是你的根本问题。逃离 32 位地址空间的方法是编译为 64 位。这需要 XE2 或更高版本。
您可能需要继续支持应用程序的 32 位版本,因为您的用户仍在使用 32 位系统。现代版本的 Delphi 有 32 位和 64 位编译器,编写在这两种情况下都能正确编译和运行的代码非常简单。
对于 32 位版本,无论如何,您都不太可能遇到内存问题,因为 32 位系统往往在处理器较少的旧硬件上运行。反过来,这意味着对内存空间的需求更少,因为线程池往往更小。
如果您遇到处理器数量足够多而导致内存不足问题的计算机,那么一种非常简单且实用的方法是为用户提供一种机制来限制应用程序线程池使用的线程数。
归档时间: |
|
查看次数: |
861 次 |
最近记录: |