gpt4 book ai didi

regex - 为什么 Scala 的组合器在解析大文件时解析速度很慢?我能做什么?

转载 作者:行者123 更新时间:2023-12-01 03:50:44 26 4
gpt4 key购买 nike

我需要解析具有数百万行的文件。我注意到我的组合器解析器在解析越来越多的行时变得越来越慢。问题似乎出在 scala 的“rep”或正则表达式解析器中,因为即使对于如下所示的简单示例解析器也会发生这种行为:

def file: Parser[Int] = rep(line) ^^ { 1 }  // a file is a repetition of lines

def line: Parser[Int] = """(?m)^.*$""".r ^^ { 0 } // reads a line and returns 0

当我尝试使用这个简单的解析器解析具有数百万行等长的文件时,一开始它解析了 46 行/毫秒。 370000行后,速度下降到20行/毫秒。 840000行后,下降到10行/毫秒。 1790000行后,5行/毫秒...

我的问题是:
  • 为什么会发生这种情况?
  • 我能做些什么来防止这种情况?
  • 最佳答案

    这可能是 Java 7u6 中更改的结果,它没有将子字符串作为原始字符串的一部分。如此大的字符串被一遍又一遍地复制,导致大量的内存流失(除其他外)。当你增加你解析的东西的数量时(我假设你至少存储了一些),垃圾收集器有越来越多的工作要做,所以创建所有额外的垃圾会有越来越大的惩罚.

    有一个ticket to fix the memory usage , 以及来自 Zach Moazeni 的代码,它允许您将字符串包装在一个构造中,该构造将正确生成子字符串(您可以将其传递到解析器中代替字符串)。

    这不一定会改变解析最终减慢的整体结果,但它应该有助于减少整体时间。

    另外,我不建议使文件重复行。您让解析器在真正不需要时跟踪整个文件。我会一次喂它一条线。 (然后如果线条很短,您可能不需要上述修复。)

    关于regex - 为什么 Scala 的组合器在解析大文件时解析速度很慢?我能做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117635/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com