我很新的内存映射,并试图理解内存映射文件,以在我的项目(基于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; }
我在这里有几个问题:
当我这样做:mf.open(params),我看到一个文件是在磁盘上创build大小为100.现在,当我写它即ie * w = w1,磁盘上的文件的内容会改变。 这是否意味着我根本不使用RAM,而是直接写入
磁盘?
当我做mf.size(),它总是给我的大小,我给了创build实际文件的input。 我怎样才能find我实际写入数据的大小
内存映射文件?
此外,如果我给params.new_file_size = 10GB,该大小的文件被创build的
磁盘,但不占用任何磁盘空间。使用df cmd确认。 为什么这样? -rwx ——。 1 root root 10000000000 Apr 29 14:26 map.dat
我读了closures文件释放映射。 这是否意味着closures后,我失去了我写的所有数据? 但是,这是不正确的,因为我有工作代码,我closures,然后再次打开文件,并正确地阅读它。
如何删除使用后创build的内存映射文件? 通过使用rm -rf cmd / linux apis?
- 当我这样做:mf.open(params),我看到一个文件是在磁盘上创建大小为100.现在,当我写它即ie * w = w1,磁盘上的文件的内容会改变。 这是否意味着我没有使用RAM,而是直接写入磁盘?
您正在使用内存映射文件。 这意味着:您正在写入已映射到进程空间的“虚拟内存页”,但实际上是指磁盘块。 增长表明页面在写入时被提交。
- 当我做mf.size(),它总是给我的大小,我给了创建实际文件的输入。 我怎样才能找到我实际写入内存映射文件的数据的大小?
你不能。 你只能找到像stat
这样的工具提交的块的数量
- 另外,如果我给params.new_file_size = 10GB,该大小的文件被创建在磁盘上,但它不占用任何磁盘空间。使用df cmd确认。 为什么这样? -rwx ——。 1 root root 10000000000 Apr 29 14:26 map.dat
这是稀疏的分配。 例如在其他平台上使用fallocate
或类似软件。
- 我读了关闭文件释放映射。 这是否意味着关闭后,我失去了我写的所有数据? 但是,这是不正确的,因为我有工作代码,我关闭,然后再次打开文件,并正确地阅读它。
不,这意味着映射被释放。 也就是说,进程空间中的/虚拟内存/区域现在可以“自由”用于其他事情。
- 如何删除使用后创建的内存映射文件? 通过使用rm -rf cmd / linux apis?
是。