2

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

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

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

那么,有没有一种方法可以为我做到这一点?似乎几乎必须有。我可以指示读取 x 行数或 x 字节但不输出最后部分行的任何方法,甚至是我管理内存缓冲区的简单方法,因此我最大限度地减少了处理部分字符串的代码量将不胜感激。我可以使用 Boost,但如果标准 C++ 中有方法,我会更喜欢。

谢谢。

4

2 回答 2

2

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

  • 使用分析器。如果您的应用程序正在读取一行然后以某种方式对其进行解析或处理,则解析或处理可能是可以优化的。这可以在分析中确定。如果解析或处理占用大量 CPU 资源,那么优化可能是值得的。
  • 如果您确定解析或处理是导致应用程序缓慢的原因,并且无法轻松优化,请考虑多道程序设计。如果单个行的处理不依赖于正在处理的先前行的结果,则使用多个线程或 CPU 来进行处理。
  • 如果您必须处理多个文件,请使用流水线。例如,假设您的应用程序中有四个阶段:读取、解析、处理、保存。一次读取一个文件可能比一次读取所有文件更有效。但是,在读取第二个文件时,您仍然可以解析第一个文件。在读取第三个文件时,您可以解析第二个文件并处理第一个文件,等等。实现这一点的一种方法是分阶段的多线程应用程序设计
  • 使用 RAID 改善磁盘读取。某些突袭模式可以创建更快的读取和写入。
于 2012-06-15T22:55:43.343 回答
0

我是java程序员,但我仍然有一个提示......读取流中的数据。这意味着例如 2048 字节(或更多)的 4 或 5 倍...您可以遍历流(并转换它)并搜索您的行尾(或其他字符)...但我认为“readLine”反正也在做同样的事情......

于 2012-06-15T22:47:27.970 回答