gpt4 book ai didi

c++ - 如何管理大型阵列

转载 作者:太空狗 更新时间:2023-10-29 20:29:20 24 4
gpt4 key购买 nike

我有一个 C++ 程序,它使用几个非常大的 double 组,我想减少程序这个特定部分的内存占用。目前,我正在分配其中的 100 个,每个可以是 100 Mb。

现在,我确实有优势,这些数组的一部分最终会在程序执行的后期部分变得过时,并且几乎不需要在任何时候将其中任何一个的全部都放在内存中。

我的问题是:

在我使用 new 或 malloc 创建数组后,是否有任何方法可以告诉操作系统其中的一部分不再是必需的?我得出的结论是,实现这一目标的唯一方法是声明一个指针数组,每个指针都可以指向一个 block ,比如所需数组的 1Mb,这样就不再需要旧 block 了可以重新用于数组的新位。在我看来,这就像编写一个自定义内存管理器,它确实有点像一把大锤,但也会对性能造成一些影响

我不能移动数组中的数据,因为它会导致过多的线程争用问题。数组可以随时被大量线程中的任何一个访问,尽管只有一个线程曾经写入任何给定数组。

最佳答案

这取决于操作系统。 POSIX - 包括 Linux - 有系统调用 madvise 来提高内存性能。从手册页:

The madvise() system call advises the kernel about how to handle paging input/output in the address range beginning at address addr and with size length bytes. It allows an application to tell the kernel how it expects to use some mapped or shared memory areas, so that the kernel can choose appropriate read-ahead and caching techniques. This call does not influence the semantics of the application (except in the case of MADV_DONTNEED), but may influence its performance. The kernel is free to ignore the advice.

有关详细信息,请参阅 madvise 的手册页。

编辑: 显然,上面的描述不够清楚。所以,这里有一些更多的细节,其中一些是特定于 Linux 的。

您可以使用 mmap 分配一 block 内存(直接从操作系统而不是 libc),它不受任何文件支持。对于大块内存,malloc 正在做完全相同的事情。您必须使用 munmap 来释放内存 - 无论 madvise 的用法如何:

void* data = ::mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// ...
::munmap(data, size);

如果你想摆脱这个 block 的某些部分,你可以使用madvise告诉内核这样做:

madvise(static_cast<unsigned char*>(data) + 7 * page_size,
3 * page_size, MADV_DONTNEED);

地址范围仍然有效,但不再支持 - 既不是物理 RAM 也不是存储。如果您稍后访问页面,内核将动态分配一些新页面并将它们重新初始化为零。请注意,不需要 页面也是进程虚拟内存大小的一部分。可能需要对虚拟内存管理进行一些配置更改,例如激活过度提交。

关于c++ - 如何管理大型阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10245227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com