提高antlr性能

2024-06-07 16:11:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个流程,每天需要解析来自Oracle数据库的约1.5亿个查询。我在这里使用antlr的PlSql语法:https://github.com/antlr/grammars-v4/blob/master/plsql/PlSqlParser.g4

Antlr生成一个包含20k行的Lexer和一个包含100k行的解析器。你知道吗

下面是一个解析非常简单的select语句的示例

from antlr4 import *
from antlr4.tree.Tree import TerminalNode
from plsql import PlSqlLexer, PlSqlParserListener, PlSqlParser
import datetime


def handleTree(tree, lvl=0):
    for child in tree.getChildren():
        if isinstance(child, TerminalNode):
            print(lvl*'│ ' + '└─', child)
        else:
            handleTree(child, lvl+1)


class KeyPrinter(PlSqlParserListener.PlSqlParserListener):
    def enterSelect_statement(self, ctx):
        handleTree(ctx, 0)


def main():
    now = datetime.datetime.now()
    i_stream = InputStream(str.upper("""SELECT col1 FROM table1"""))

    lexer = PlSqlLexer.PlSqlLexer(i_stream)
    t_stream = CommonTokenStream(lexer)
    parser = PlSqlParser.PlSqlParser(t_stream)
    tree = parser.sql_script()

    printer = KeyPrinter()
    walker = ParseTreeWalker()
    walker.walk(printer, tree)

    print(datetime.datetime.now()-now)


if __name__ == '__main__':
    main()

输出:

│ │ │ └─ SELECT
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ COL1
│ │ │ │ └─ FROM
│ │ │ │ │ │ │ │ │ │ │ │ │ └─ TABLE1
0:00:36.104422

解析这个简单的查询需要36秒。我可以选择什么来提高性能?换一种语言更好吗?你知道吗

  • 这最终将是部署在Openshift上的REST微服务。我可以扔很多的硬件在它的许多豆荚,但数量我需要现在是不可行的。你知道吗

Tags: fromimportchildtreestreamdatetimemaindef

热门问题