gpt4 book ai didi

c++ - 使用 boost::iostreams::mapped_file 时的内存使用情况

转载 作者:太空狗 更新时间:2023-10-29 12:16:19 26 4
gpt4 key购买 nike

我在这里粘贴了一些代码,它使用 boost iostream 进行 mmap,然后写入映射文件:

typedef unordered_map<int, string> work;

int main()
{

work d;
d[0] = "a";

boost::iostreams::mapped_file_params params;
params.path = "map.dat";
params.new_file_size = 1000000000;
params.mode = (std::ios_base::out | std::ios_base::in);
boost::iostreams::mapped_file mf;
mf.open(params);
work* w = static_cast<work*>((void*)mf.data());
w[0] = d;
for(int i=1; i <1000000000 ;++i)
{
w->insert(std::make_pair(i, "abcdef"));
}
mf.close();

}

当我在配备 8 个处理器和 16GB RAM 的 centos 6 机器上执行此操作时,我观察到以下内容:

  1. 当数据被插入内存映射文件时,RES(来自top命令)不断增加,直到14GB。我的印象是,当我映射文件时,VIRT 会增加而不是 RES。那么我们写mmap文件是不是先写入内存,再commit到磁盘呢?或者是否使用了任何中间缓冲区/缓存?

  2. 在“free”命令的帮助下,我还观察到内存使用量达到 16GB 后,会使用缓冲区。以下是执行上述代码时不同时间的 free 命令的一些快照:

                total       used       free     shared    buffers     cached
    Mem: 16334688 10530380 5804308 0 232576 9205532
    -/+ buffers/cache: 1092272 15242416
    Swap: 18579448 348020 18231428

    total used free shared buffers cached
    Mem: 16334688 13594208 2740480 0 232608 9205800
    -/+ buffers/cache: 4155800 12178888
    Swap: 18579448 348020 18231428

    total used free shared buffers cached
    Mem: 16334688 15385944 948744 0 232648 9205808
    -/+ buffers/cache: 5947488 10387200
    Swap: 18579448 348020 18231428

    total used free shared buffers cached
    Mem: 16334688 16160368 174320 0 204940 4049224
    -/+ buffers/cache: 11906204 4428484
    Swap: 18579448 338092 18241356

    total used free shared buffers cached
    Mem: 16334688 16155160 179528 0 141584 2397820
    -/+ buffers/cache: 13615756 2718932
    Swap: 18579448 338092 18241356

    total used free shared buffers cached
    Mem: 16334688 16195960 138728 0 5440 17556
    -/+ buffers/cache: 16172964 161724
    Swap: 18579448 572052 18007396

    这种行为意味着什么?

  3. 与写入内存相比,将数据写入内存映射文件需要花费大量时间。这是什么原因?

    在处理大量数据时,我想使用内存映射来降低 RES 使用率。但它似乎不是那样工作的。希望将所有数据保存在内存映射文件中,并在需要时读回。

    我是否错误地使用了内存映射?或者这就是它的行为方式?

最佳答案

  1. VIRT 会立即增加(所有页面都映射到进程地址空间)。只要页面被使用,RES 就会增加,这会导致它们被分页到物理内存中。

    只要有足够的可用内存就会发生这种情况,之后操作系统开始从保留集中清除 LRU 页面(除非它们是 VirtualLock/mlock-ed或以其他方式不可移动(如内核页面、DMA 缓冲区、安全敏感数据等)。

    因此,操作系统乐观地尽可能长时间地保留页面(只要没有其他进程争用内存,这会 boost 性能)。

  2. 这表示操作系统正在执行其工作。

  3. 您正在写入磁盘。磁盘访问(很多)比内存访问慢。数据实际写入磁盘的频率取决于调整。这个答案列出了 linux 上可用的一些调整参数(您似乎正在使用):

关于c++ - 使用 boost::iostreams::mapped_file 时的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468227/

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