我一直在使用 malloc()
分配内存来开发我的程序。但是,我的调查让我认为我面临着内存碎片问题。
我的程序需要 5 次内存分配,每次分配约 70 MB。当我使用 4 个线程运行我的程序时,我需要 5x4 内存分配,每个内存分配 ~70 MB(而且我不能使用更少的内存)。最后,我希望能够使用我的 i7 的 8 个内核,即 5x8 内存分配。
如果我执行 5x2 malloc()s,程序就可以运行。不适用于 5x3 malloc()。
我一直在阅读有关 std::vector
和 std::deque
的内容。我相信 std::deque
是我解决这个问题的方法,因为 std::vector
分配了一大块连续的内存作为 malloc()
确实如此。
是否还有其他解决方案可供探索,或者 std::deque
是我唯一的解决方案?
编辑
操作系统:Windows 8.1 (x64)
RAM:8 GB(5 GB 可用空间)
我通过检查 errno == ENOMEM
来检测 malloc()
错误
注意:ERROR_MEM_ALLOC_FAILED
是我在内存分配失败时生成的错误之一。
具有 4 个线程(即 5x4 malloc()
s)的程序的调试跟踪:
Start
Thread 01
(+53.40576 MB) Total allocated 53.4/4095 total MB
(+53.40576 MB) Total allocated 106.8/4095 total MB
(+0.00008 MB) Total allocated 106.8/4095 total MB
(+0.00008 MB) Total allocated 106.8/4095 total MB
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
Thread 02
(+53.40576 MB) Total allocated 160.2/4095 total MB
(+53.40576 MB) Total allocated 213.6/4095 total MB
(+0.00008 MB) Total allocated 213.6/4095 total MB
(+0.00008 MB) Total allocated 213.6/4095 total MB
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
Thread 03
(+53.40576 MB) Total allocated 267.0/4095 total MB
Tried to allocate 53 MB
ERROR_MEM_ALLOC_FAILED
Thread 04
Tried to allocate 53 MB
ERROR_MEM_ALLOC_FAILED
End of program
我尝试运行同样的东西,但改变了内存分配的顺序,但没有分配内存。
Start
Thread 01
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
Thread 02
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
Thread 03
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
Thread 04
Tried to allocate 267 MB
ERROR_MEM_ALLOC_FAILED
End of program
解决方案
解决方案是将该应用程序编译为 64 位应用程序。因此,这可能不是碎片问题。
最佳答案
为什么您认为这是内存碎片问题?碎片通常是由分配和删除大量不同大小的 block 引起的,导致分配之间的可用内存空洞不可用或大小不可用。这听起来根本不像您描述的内存访问模式。
此外,尽管这取决于您的硬件和操作系统,但按照今天的标准,这个内存量并不大。你的机器有多少物理内存?你运行的是什么操作系统?它是构建为 32 位还是 64 位应用程序?您怎么知道 malloc
失败了 - 它是否返回了 null
?您是否尝试过内存分析?
Heap usage: 8 threads * 5 blocks * 70MB per block = 2800MB total
在 Windows 上,对于 32 位程序,堆分配的默认每个进程限制为 2GB,因此很可能会达到此限制。最好的解决方案可能是在 64 位模式下开发您的应用程序,然后您可以分配大量(虚拟)RAM。
I have been reading about std::vector and std::deque. I believe that std::deque is my solution for this problem, as std::vector allocates a big chunk of consecutive memory as malloc() does.
不,使用 std::vector
或 std::deque
不一定能解决您的问题,如果它是碎片化或过度分配(最有可能)。无论如何,它们都将在其实现中使用 new/malloc
来分配内存,因此如果您已经知道分配的范围,您不妨像现在这样预先申请全部内存。
There any other solutions to explore or std::deque is my only solution?
deque
不是解决方案- 分析您的内存需求、访问模式并减少使用量
- 如果使用量不能低于 2GB,请切换到 64 位操作系统
关于c++ - 大数据 block 的 C++ 中的碎片 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37855020/