一次从文件中读取多行而没有部分行的方法

时间:2012-06-15 22:34:40

标签: c++ file input

我正在读取CSV文件,解析它并存储数据,非常简单。

现在正在使用标准readLine()方法来做到这一点,我正试图从这个处理循环中挤出一些额外的效率。我不知道他们在幕后隐藏了多少,但我认为每次调用getLine都是一个新的操作系统调用,带来了所有的痛苦?我不想在每行输入上支付OS调用。我会提供一个巨大的缓冲区,并让它一次用多行填充缓冲区。

但是,我只关心全线。我不想处理从一个缓冲区读取维护部分行以附加到第二个缓冲区读取以形成一个完整的行,这只是丑陋和恼人。

那么,有没有一种方法能为我做到这一点?似乎几乎必须如此。我可以指示读取x行数或x字节但不输出最后一个部分行的任何方法,或者甚至是我管理内存缓冲区的简单方法,因此我最小化处理部分字符串的代码量不胜感激。我可以使用Boost,但如果标准C ++中有一个方法,我宁愿这样做。

感谢。

2 个答案:

答案 0 :(得分:2)

你不可能比内置的C ++流做得更好。他们很快。通常,完全读取文件的最快方法是使用单个线程从头到尾读取整个文件,特别是如果文件在磁盘上是连续的。此外,在读取过程中,磁盘可能比操作系统更容易成为瓶颈。如果您需要提高应用的性能,我会提出一些建议。

  • 使用分析器。如果您的应用正在读取一行,然后解析它或以某种方式处理它,那么解析或处理可能是可以优化的。这可以在分析中确定。如果解析或处理占用大量CPU资源,那么优化可能是值得的。
  • 如果您确定解析或处理导致应用程序运行缓慢,并且无法轻松优化,请考虑进行多道程序设计。如果单个行的处理不依赖于先前行的处理结果,则使用多个线程或CPU进行处理。
  • 如果必须处理多个文件,请使用管道传输。例如,假设您的应用程序中有四个阶段:阅读,解析,处理,保存。一次读取一个文件而不是一次读取所有文件可能更有效。但是,在读取第二个文件时,您仍然可以解析第一个文件。在读取第三个文件时,您可以解析第二个文件并处理第一个文件,等等。实现此目的的一种方法是staged mult-threaded application design
  • 使用RAID改进磁盘读取。某些raid模式可以创建更快的读写。

答案 1 :(得分:0)

我是java程序员,但我仍有提示...在流中读取数据。这意味着例如2或5倍2048字节(或更多)...你可以遍历流(并转换它)并搜索你的行结束(或其他一些char)...但我认为“readLine”无论如何都在做同样的事情......