c++ - 大数据 block 的 C++ 中的碎片 (Windows)

标签 c++ windows memory-management

我一直在使用 malloc() 分配内存来开发我的程序。但是,我的调查让我认为我面临着内存碎片问题。

我的程序需要 5 次内存分配,每次分配约 70 MB。当我使用 4 个线程运行我的程序时,我需要 5x4 内存分配,每个内存分配 ~70 MB(而且我不能使用更少的内存)。最后,我希望能够使用我的 i7 的 8 个内核,即 5x8 内存分配。

如果我执行 5x2 malloc()s,程序就可以运行。不适用于 5x3 malloc()。

我一直在阅读有关 std::vectorstd::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::vectorstd::deque 不一定能解决您的问题,如果它是碎片化或过度分配(最有可能)。无论如何,它们都将在其实现中使用 new/malloc 来分配内存,因此如果您已经知道分配的范围,您不妨像现在这样预先申请全部内存。

There any other solutions to explore or std::deque is my only solution?

  1. deque 不是解决方案
  2. 分析您的内存需求、访问模式并减少使用量
  3. 如果使用量不能低于 2GB,请切换到 64 位操作系统

关于c++ - 大数据 block 的 C++ 中的碎片 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37855020/

相关文章:

c++ - ShellExecute 在 C++ 中打开一个 .exe

windows - CMD(命令提示符)进不去桌面

c++ - 有没有办法可以将字符串数组成员放在 ".structurevariable"前面?

C++:仅在一个元素上使用 unique_copy

windows - 为当前 chef-client 运行设置环境变量

windows - Windows Powershell 中的 Unix tail 等效命令

ios - 从 Interface Builder 实例化的 View 中的僵尸对象

iphone - 在 Objective C 中检查内存分配的正确方法

memory-management - Erlang - 循环和内存分配

c++ - Blowfish 和 undefined reference `BF_set_key'