【问题标题】:Faster way to write an integer vector to a binary file with C++?使用 C++ 将整数向量写入二进制文件的更快方法?
【发布时间】:2021-04-10 22:51:15
【问题描述】:

我目前有以下方法将vector<int>对象写入二进制文件。

void save_config(std::string fname, std::vector<int> config) {
    std::ofstream out(fname);
    for (auto&& item : config)
        out << item;
}

但是,我需要保存的数据大约为 60 MB,使用此功能写入大约需要 5 秒。此外,我必须为我正在运行的算法的每次迭代编写一个二进制文件,并且生成这个数量级数据的输入大小的单次迭代可能大约是 500 毫秒。

我可以掩盖算法执行时间后面的写入时间,但是由于运行时的这种差异,这并不重要。有什么办法可以改善我的save_config 功能吗?另外,我使用的是二进制文件,因为我已经准备好它是最快的写入格式;但具体格式并不重要,如果有人有其他建议,我很乐意听到。

【问题讨论】:

  • 如果是二进制文件,为什么不直接使用fwriteout.write()写入整个向量缓冲区的内容而不写循环呢?其次,您显示的 std::ofstream 是以文本模式打开的,而不是二进制模式。
  • 另请注意,您需要在文件中指明您已写入的项目数。如果您不知道向量有多大,您将如何阅读?如果您决定写入二进制文件,则需要考虑所有这些事情——您需要知道如何正确解释该文件,以便正确读取它。
  • out &lt;&lt; item; 写入文本,而不是二进制。您将永远无法正确读取该文件。假设您有一个带有 111 条目的向量,这就是您的文件包含的内容。具有 3 个 1 条目或两个 11, 11, 11 条目的向量都会为您提供相同的文件。
  • 请注意,CPU 有大端和小端 CPU,并不是每个编译器都使用相同的 int

标签: c++ binaryfiles stdvector


【解决方案1】:

它是否会导致明显更快的操作必须进行测试,但write() function 的以下使用避免了遍历向量:

#include <fstream>
#include <vector>

void save_config(std::string fname, std::vector<int> config)
{
    std::ofstream out(fname, std::ios_base::binary);
    uint64_t size = config.size();
    out.write(reinterpret_cast<char*>(&size), sizeof(size));
    out.write(reinterpret_cast<char*>(config.data()), size * sizeof(int));
}

请注意,我还包括了一个“前缀”来记录向量的大小,以便以后从文件中读取数据时可以确定;为此,我使用了一个固定大小的类型(64 位),以避免与具有 32 位 size_t 类型的平台可能出现的问题(您或许应该考虑使用固定大小的整数类型,例如 int32_t,以避免类似的问题)。

【讨论】:

  • 在使用std::ofstream 时不需要显式指定std::ios_base::out 标志,该标志始终是隐含的。但更重要的是,你不应该使用operator&lt;&lt;来写向量的size(),而是使用out.write(),否则后面将无法读取。
  • @Remy 是的,当然 - 这是一个ofstream,所以out 标志已经存在了!你的第二点涉及一个更严重的错误。查看修改。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多