将结构数组写入文本文件的快速有效方法

时间:2015-11-04 18:12:06

标签: c++ arrays file struct

我有一个二进制文件。我正在使用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的信息。但我不确定它是如何运作的。

1 个答案:

答案 0 :(得分:0)

将结构写入文件的最有效方法是在最少的事务中尽可能多地编写。

通常这意味着使用数组并使用一个事务编写整个数组。

该文件是 stream 设备,当数据在流中持续流动时效率最高。这可以像在一次调用中将数组写入更复杂的使用线程一样简单。通过执行阻塞或突发I / O可以节省更多时间,而不必担心要使用哪个函数调用。

此外,在我自己的程序中,我观察到将格式化文本放入缓冲区(数组)然后阻止写入缓冲区比使用函数将格式化文本写入文件更快。格式化过程中数据流可能会暂停。通过从缓冲区写入格式化数据,通过流的数据流是连续的。

写入文件还涉及其他因素,例如在媒体上分配空间,在系统上运行的其他任务以及文件媒体的任何共享。

通过使用上述技术,我能够在几分钟内编写GB数据,而不是之前的小时数。

相关问题