在c中快速读取大于内存的文件

时间:2012-09-01 22:06:16

标签: c file file-io

我想读取几个文件中的行而不是每行一行。 文件不适合内存,所以我必须从磁盘读取。 C中从具有最佳性能的几个文件中读取特定行的最佳方法是什么?

示例:

  • 文件4中的第1行
  • 第2行第2行
  • 文件4中的第5行.......

4 个答案:

答案 0 :(得分:2)

在Linux上,您可以使用mmap(2)系统调用来读取和存储以兆字节块为单位映射文件,可能使用madvise(2),也许(在另一个线程中)readhahead(2)系统调用。< / p>

但瓶颈可能是你的硬件。考虑使用SSD或非常快的磁盘。

如果你对行边界感兴趣,你应该明确地管理它们(并记住它们),或者记住一些换行符的一些偏移。

答案 1 :(得分:2)

如果您使用的是Linux或Windows,则可以创建该文件的文件映射。这不会放入内存中,并且可以快速访问文件的缓冲区。

在linux中你可以检查那个人是否有“mmap”。

在Windows中我不记得了,但你可以谷歌它:Windows上的文件映射。

关于逐行阅读,您只需使用fscanf或实现自己的功能,请记住:在Linux中读取“\ n”,在Windows中读取“\ r \ n”。

祝你好运!

答案 2 :(得分:1)

您的问题不在于读取文件。 您的问题是要知道要读取的文件的哪一部分。

为此,您必须事先准备一个索引表,其中包含每行开头的位置。

当然,您可以以懒惰的方式构建它,然后需要第N行。

答案 3 :(得分:0)

不知道您使用的是哪个文件系统,但几乎可以肯定它无法自动跟踪断路器在文件保留的内存中的位置。

这就是说,为了有办法快速访问特定行的文件,你需要建立一个行的索引,如果没有任何已知的你正在处理的文件的适当性,您需要至少完整扫描一次文件以构建此类索引。

显然,如果文件大于系统RAM,则需要在执行构建索引所需的扫描时实施明智的内存管理。

创建索引后,您只需访问要读取的内存的唯一部分。