【问题标题】:c++ boost write memory mapped filec++ boost写入内存映射文件
【发布时间】:2016-01-08 03:47:30
【问题描述】:

我正在寻找使用 C++ 和 boost 库快速编写文件的方法。我想使用内存映射文件。但几乎所有示例都是关于阅读的。
工作非常简单。有一个字符串数组。数组元素约200万个。

ofstream outFile("text.txt");
for (int i = 0; i < 2000000; ++i) {
    outFile << strArray[i] << "\n";
}
outFile.close();

如何使用内存映射文件来做到这一点?我在哪里可以找到使用内存映射文件的写入文件?

感谢您的关心。

【问题讨论】:

    标签: c++ boost memory-mapped-files


    【解决方案1】:

    我知道没有可移植的方式来处理内存映射文件(尽管 boost 可能有一些东西,boost 通常有......)。你在使用 Linux 吗?然后有很好的机制可以用内存映射文件编写高性能的东西,例如地图(2)。这些机制也可以部分移植到其他主要的 Unix OS:es。 (是的,Linux 是 Unix)对于某些应用程序,使用线程(当然共享虚拟内存空间)是一种替代方法。那么你就不存在便携性问题了。

    【讨论】:

    • @blank_popup 如果你喜欢这个答案,也许可以投票?
    【解决方案2】:

    有一个专门用于此的 boost 库。它被称为“增强进程间”。

    文档(带有示例)在这里:

    http://www.boost.org/doc/libs/1_59_0/doc/html/interprocess.html

    【讨论】:

      【解决方案3】:

      您可以为此使用 Boost Iostreams mapped_file{_sink,_source}

      虽然 Boost Interprocess 确实使用映射文件,但您最好使用 IOstreams 进行这种原始访问。

      http://www.boost.org/doc/libs/1_50_0/libs/iostreams/doc/classes/mapped_file.html

      Live On Coliru

      #include <boost/iostreams/device/mapped_file.hpp>
      #include <boost/iostreams/stream.hpp>
      #include <vector>
      
      namespace bio = boost::iostreams;
      
      int main() {
          using namespace std;
          vector<string> strArray(2000000);
      
          bio::mapped_file_params params;
          params.path          = "text.txt";
          params.new_file_size = 30ul << 30;
          params.flags         = bio::mapped_file::mapmode::readwrite;
      
          bio::stream<bio::mapped_file_sink> out(params);
      
          copy(strArray.begin(), strArray.end(), ostream_iterator<string>(out, "\n"));
      }
      

      【讨论】:

      • 添加了演示Live On Coliru
      • 感谢您的帮助。我看过你这么多的著作并学到了。
      猜你喜欢
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2016-12-08
      • 2012-10-11
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多