gpt4 book ai didi

linux - 使用 boost::iostreams::mapped_file

转载 作者:太空狗 更新时间:2023-10-29 12:03:46 25 4
gpt4 key购买 nike

我对内存映射非常陌生,并试图了解内存映射文件以在我的项目(基于 Linux)中使用它们。我的要求是写入然后从内存映射文件中读取。我写了一个示例程序,它只写并且运行良好,但我有一些非常基本的疑问,因为我没有正确理解内存映射的基础。

#include <unordered_map>
#include <boost/iostreams/device/mapped_file.hpp>
using namespace boost::interprocess;
using namespace std;
typedef unordered_map<int, string> work;
int main()
{
boost::iostreams::mapped_file_params params;
params.path = "map.dat";
params.new_file_size = 100;
params.mode = (std::ios_base::out | std::ios_base::in);
boost::iostreams::mapped_file mf;
mf.open(params);
work w1;
w1[0] = "abcd";
w1[1] = "bcde";
w1[2] = "cdef";

work* w = static_cast<work*>((void*)mf.data());
*w = w1;
mf.close();
return 0;
}

我有几个问题:

  1. 当我执行此操作时:mf.open(params),我看到在磁盘上创建了一个大小为 100 的文件。现在,当我写入它时,即 *w = w1,磁盘上文件的内容发生了变化。这是否意味着我根本没有使用 RAM,而是直接写入
    磁盘?

  2. 当我执行 mf.size() 时,它总是给我提供的大小,作为创建时的输入实际文件。我怎样才能找出我实际写入的数据的大小
    内存映射文件?

  3. 此外,如果我给 params.new_file_size = 10GB,该大小的文件将在
    磁盘但它不占用任何磁盘空间。使用 df cmd 确认。为什么这样?-rwx------。 1 root root 10000000000 Apr 29 14:26 map.dat

  4. 我读到关闭文件会释放映射。这是否意味着关闭后我失去了所有我写的数据?但这不是真的,因为我有关闭和关闭的工作代码然后再次打开文件并正确阅读。

  5. 如何删除使用后创建的内存映射文件?通过使用 rm -rf cmd/linux apis?

最佳答案

  • When i do this : mf.open(params) , i see that a file is created on disk with size 100. Now when i write to it i.e *w = w1, the contents of the file on disk changes. Does this mean that i am not using the RAM at all and i am writing straight into the disk?

您正在使用内存映射文件。这意味着两者:您正在写入已映射到您的进程空间的“虚拟内存页面”,但实际上指的是磁盘 block 。增长表明页面在写入时得到提交。

  • When i do mf.size(), it always give me the size which i gave as the input for creating the actual file. How can i find out the size of the data that i actually wrote into the memory mapped file?

你不能。您只能使用 stat

之类的工具找到提交的 block 数
  • Also if i give params.new_file_size = 10GB, the file of that size gets created on the disk but it does not take up any disk space.Confirmed by using df cmd. Why so? -rwx------. 1 root root 10000000000 Apr 29 14:26 map.dat

它是稀疏分配的。例如。在其他平台上使用 fallocate 或类似工具。

  • I read that close file frees the mapping. Does this mean that after close i lose all the data that i wrote? But this is not true as i have the working code where i close and then open the file again and read it correctly.

没有。这意味着映射被释放。也就是说,您的进程空间中的/virtual memory/区域现在“免费”用于其他用途。

  • How to delete the memory mapped files created after use? By using rm -rf cmd/linux apis?

是的。

关于linux - 使用 boost::iostreams::mapped_file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23383681/

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