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

Fast and efficient way of writing an array of structs to a text file

本文关键字:高效 方法 文件 文本 结构 数组      更新时间:2023-10-16

我有一个二进制文件。我正在使用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';

代码有效。但速度很慢。还有一种方法是先创建整个字符串,最后只向文件写入一次。

但我想知道是否有什么最好的方法可以做到这一点。我发现了一些关于鸵鸟的信息。但我不确定它是如何运作的。

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

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

该文件是设备,当数据在流中连续流动时效率最高。这可以很简单,只需在一次调用中将数组写入更复杂的使用线程即可。执行块或突发I/O将比担心使用哪个函数调用节省更多时间。

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

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

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