【问题标题】:What is the optimal (speed) way of parsing a large (> 4GB) text file with many (milions) of lines?解析具有许多(数百万)行的大型(> 4GB)文本文件的最佳(速度)方法是什么?
【发布时间】:2009-01-05 23:24:37
【问题描述】:

我正在尝试确定读取具有多行的大型文本文件、进行一些处理并将它们写入新文件的最快方法。在 C#/.net 中,StreamReader 似乎是一种看似快速的方法,但是当我尝试使用这个文件(逐行读取)时,它的速度大约是 python I/O 速度的 1/3(这让我担心因为我一直听说 Python 2.6 的 IO 比较慢)。

如果没有更快的 .Net 解决方案,是否可以编写比 StreamReader 更快的解决方案,或者它是否已经使用了我永远不希望击败的复杂缓冲区/算法/优化?

【问题讨论】:

  • 一个问题,你的C#代码的瓶颈在哪里?您是否对代码进行了分析或测量? Python 1/3 的速度似乎不适用于涉及大量磁盘访问的操作。
  • 每个人都得到一个有效的答案?您是否正在阅读 EOF,或者您使用流阅读器的策略是什么?

标签: c# .net parsing text buffer


【解决方案1】:

你有你正在做什么的代码示例,或者你正在阅读的文件的格式吗?

另一个好问题是您一次在内存中保留了多少流?

【讨论】:

    【解决方案2】:

    StreamReader 非常好 - 你是如何用 Python 阅读它的?如果您指定更简单的编码(例如 ASCII),那么这可能会加快速度。进程占用多少 CPU?

    您可以通过使用适当的 StreamReader 构造函数来增加缓冲区大小,但我不知道这可能会产生多大的差异。

    【讨论】:

    • 我希望增加他的 StreamWriter 的缓冲区大小(大概他正在使用一个)会产生相当大的不同。
    【解决方案3】:

    如果您自己的代码一次检查一个字符,您希望使用 sentinel 来标记缓冲区的结尾或文件的结尾,这样您就只有一个在你的内部循环中测试。在您的情况下,一个测试将用于行尾,因此您需要在每个缓冲区的末尾临时粘贴一个换行符。

    关于哨兵的维基百科文章根本没有帮助;它没有描述这种情况。您可以在任何 Robert Sedgewick 的算法教科书中找到描述。

    您可能还想查看re2c,它可以生成非常快速的代码来扫描文本数据。它会生成 C 代码,但您可以调整它,您当然可以通过阅读他们关于 re2c 的论文来学习这些技术。

    【讨论】:

      【解决方案4】:

      对不起,如果我不是 .NET 专家,但在 C/C++ 中,如果你有很好的大缓冲区,你应该能够使用 LL1 解析器来解析它,而且速度不会比扫描字节慢多少。如果您愿意,我可以提供更多详细信息。

      【讨论】:

        【解决方案5】:

        尝试使用 BufferedReader 和 BufferedWriter 来加快处理速度。

        【讨论】:

        • 我认为它们是 Java 类。 .Net 的 StreamReader 已被缓冲。
        • 是的,这些确实是 Java 类,他正在寻找 C# 中的修复程序。如果是 Java,我会推荐同样的东西。
        【解决方案6】:

        StreamReader/FileStream 使用的默认缓冲区大小对于数据中的记录长度可能不是最佳的,因此您可以尝试调整它们。您可以覆盖 FileStream 和包装它的 StreamReader 的构造函数中的默认缓冲区长度。您可能应该使它们的大小相同。

        【讨论】:

          【解决方案7】:

          一般说明:

          1. 高性能流并不复杂。您通常必须修改使用流数据的逻辑; 很复杂。

          其实就是这样。

          【讨论】:

            猜你喜欢
            • 2013-11-11
            • 1970-01-01
            • 2011-12-18
            • 2010-09-14
            • 2010-09-13
            • 1970-01-01
            • 1970-01-01
            • 2019-11-26
            • 1970-01-01
            相关资源
            最近更新 更多