使用 C++ 将整数向量写入二进制文件的更快方法?
Faster way to write an integer vector to a binary file with C++?
我目前有以下方法将 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
功能吗?另外,我正在使用二进制文件,因为我已经准备好它是最快的写入格式;但是具体的格式并不重要,如果有人有其他建议,我很乐意听取。
是否会显着加快操作速度还有待测试,但以下使用 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));
}
请注意,我还包含了一个'prefix'来记录向量的大小,以便稍后从文件中读取数据时可以确定;我为此使用了固定大小的类型(64 位),以避免使用 32 位 size_t
类型的平台可能出现的问题(您或许应该考虑使用固定大小的整数类型,例如 int32_t
,以避免类似问题)。
我目前有以下方法将 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
功能吗?另外,我正在使用二进制文件,因为我已经准备好它是最快的写入格式;但是具体的格式并不重要,如果有人有其他建议,我很乐意听取。
是否会显着加快操作速度还有待测试,但以下使用 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));
}
请注意,我还包含了一个'prefix'来记录向量的大小,以便稍后从文件中读取数据时可以确定;我为此使用了固定大小的类型(64 位),以避免使用 32 位 size_t
类型的平台可能出现的问题(您或许应该考虑使用固定大小的整数类型,例如 int32_t
,以避免类似问题)。