我有一个二进制文件。我正在使用fread方法将该文件中的数据块读入结构数组。我的结构如下所示。
struct Num {
uint64_t key;
uint64_t val
};
我的主要目标是将数组写入不同的文本文件,每行包含空格分隔的键和值对,如下所示。
Key1 Val1
Key2 Val2
Key3 Val3
我写了一个简单的函数来做到这一点。
Num *buffer = new Num[buffer_size];
// Read a block of data from the binary file into the buffer array.
ofstream out_file(OUT_FILE, ios::out);
for(size_t i=0; i<buffer_size; i++)
out_file << buffer[i].key << ' ' << buffer[i].val << '\n';
代码有效。但它很慢。另一种方法是首先创建整个字符串,然后在结尾处只写入一次文件。
但我想知道是否有最佳方法可以做到这一点。我找到了一些关于ostream_iterator的信息。但我不确定它是如何运作的。
答案 0 :(得分:0)
将结构写入文件的最有效方法是在最少的事务中尽可能多地编写。
通常这意味着使用数组并使用一个事务编写整个数组。
该文件是 stream 设备,当数据在流中持续流动时效率最高。这可以像在一次调用中将数组写入更复杂的使用线程一样简单。通过执行阻塞或突发I / O可以节省更多时间,而不必担心要使用哪个函数调用。
此外,在我自己的程序中,我观察到将格式化文本放入缓冲区(数组)然后阻止写入缓冲区比使用函数将格式化文本写入文件更快。格式化过程中数据流可能会暂停。通过从缓冲区写入格式化数据,通过流的数据流是连续的。
写入文件还涉及其他因素,例如在媒体上分配空间,在系统上运行的其他任务以及文件媒体的任何共享。
通过使用上述技术,我能够在几分钟内编写GB数据,而不是之前的小时数。