如何高效地读取一个不断增长的大文件



现有应用程序在运行时不断写入输出文件。我希望能够在另一个(C++(应用程序中逐行读取此文件,以便进行外部处理。

一个现实的场景是现有的应用程序已经运行了一段时间。我的新应用程序启动并通过输出文件工作,"赶上"最新的条目。然后,它等待将新行写入文件。

我不需要分析整个文件,只需要逐行读取它——它不是XML或JSON或类似的东西。由于文件可能很大,我绝对不想把它全部加载到内存中。我已经很久没有在C++中处理低级文件访问了,所以我的问题是:

  • 标准文件API允许我在不将文件缓存在内存中的情况下读取文件吗?如果是,我该如何控制
  • 从正在写入的文件中读取是否需要特别注意

我知道这可以在操作系统级别完成,但我不确定这是如何通过标准库中的C++API公开的。

逐行读取正在增长的文件时,需要注意以下几个问题:

  1. 生产者可能不需要以原子方式将一行写入文件。std::getline/gets去掉后面的n,所以你不知道它是读满了整行还是EOF被击中了
  2. C++标准库中没有等待文件增长的设施

您需要编写自己的getline,即:

  1. 读取固定长度的缓冲区,该缓冲区必须至少与生产者可以写入的最长行一样大。使用特定于平台的函数,如POSIXread,这样就不需要一直清除ifstreamFILE*上的EOF状态
  2. 在缓冲区中查找完整的行,并将它们传递给调用者。一条不完整的行被移到缓冲器的开头,随后的read读取经过该不完整行
  3. EOFread上命中时,将使用特定于平台的方式(如inotify(等待文件增长。在没有竞争条件的情况下,这可能很难实现,因此您可能希望在合理的超时后重试读取文件。转到1

最新更新