使用boost :: iostreams :: mapped_file

时间:2014-04-30 08:50:55

标签: linux boost memory-mapped-files boost-iostreams

我对内存映射非常陌生,并试图了解内存映射文件,以便在我的项目中使用它们(基于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?

1 个答案:

答案 0 :(得分:3)

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

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

  
      
  • 当我做mf.size()时,它总是给我一个大小,我给它作为创建实际文件的输入。如何找出我实际写入的数据的大小   内存映射文件?
  •   

你不能。您只能找到使用stat

等工具提交的块数
  
      
  • 此外,如果我给params.new_file_size = 10GB,则会在该文件上创建该大小的文件   磁盘,但它不占用任何磁盘空间。使用df cmd确认。为什么这样? -rwx ------。 1 root root 10000000000 Apr 29 14:26 map.dat
  •   

分配稀少。例如。在其他平台上使用fallocate或类似内容。

  
      
  • 我读到该关闭文件释放了映射。这是否意味着在关闭之后我会丢失我写的所有数据?但这不是真的,因为我有工作代码,我关闭然后再次打开文件并正确读取它。
  •   

没有。这意味着映射被释放。也就是说,您的流程空间中的/虚拟内存/区域现在是免费的&#39;用于其他事情。

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