我有一个 ASCII 文件,其中每一行都包含一个可变长度的记录。例如
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters
由于文件大小约为 10GB,我想分块读取记录。一旦读取,我需要转换它们,将它们以二进制格式写入另一个文件。
因此,为了阅读,我的第一反应是创建一个 char 数组,例如
FILE *stream;
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
- linux 将发出一个系统调用并获取整个 100MB 的假设是否正确?
- 由于记录由换行符分隔,因此我在缓冲区中逐个字符搜索新行字符并重建每个记录。
我的问题是,我应该如何分块读取数据,或者是否有更好的替代方法来分块读取数据并重建每个记录?是否有另一种方法可以在一次调用中从 ASCII 文件中读取 x 个可变大小的行?
接下来在写作过程中,我也会这样做。我有一个写入字符缓冲区,我将其传递给 fwrite 以在一次调用中写入一整套记录。
fwrite(buffer, sizeof(buffer), 104857600, stream);
更新:如果我 setbuf(stream, buffer),其中 buffer 是我的 100MB 字符缓冲区,fgets 是否会从缓冲区返回或导致磁盘 IO?