我在这里粘贴一些代码,它使用 boost iostream 来映射然后写入映射文件:
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 机器上执行此操作时,我观察到以下情况:
当数据被插入内存映射文件时,RES(来自 top 命令)不断增加,直到 14GB。我的印象是,当我映射文件时,VIRT 会增加而不是 RES。那么,当我们写入 mmap 文件时,是不是先将其写入内存,然后再提交到磁盘?或者是否使用了任何中间缓冲区/缓存?
在“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
这种行为意味着什么?
与写入内存相比,将数据写入内存映射文件需要花费大量时间。这是什么原因?
在处理大量数据时,我想使用内存映射来降低 RES 的使用。但它似乎不是那样工作的。想要将所有数据保存在内存映射文件中,并在需要时将它们读回。
我是否错误地使用了内存映射?或者这就是它的行为方式?