Java 如何提高JSON解析的性能

Java 如何提高JSON解析的性能,java,json,performance,parallel-processing,Java,Json,Performance,Parallel Processing,我有一个场景,用户要上传一个zip文件。这个zip文件可以有4999个json文件,每个json文件可以有4999个节点,我正在解析和创建对象。最后,我将它们插入数据库中。当我测试这个场景时,我花了30-50分钟来解析 我在哪里寻找建议 我想并行读取JSON文件:假设我有一批100个JSonfile,那么我可以有50个线程并行运行 每个线程将负责解析JSON文件,这可能会导致另一个性能瓶颈,因为我们要解析4999个节点。所以我想一次再读取100个节点,这将再次导致50个子线程 因此,系统中总

我有一个场景,用户要上传一个zip文件。这个zip文件可以有4999个json文件,每个json文件可以有4999个节点,我正在解析和创建对象。最后,我将它们插入数据库中。当我测试这个场景时,我花了30-50分钟来解析

我在哪里寻找建议

  • 我想并行读取JSON文件:假设我有一批100个JSonfile,那么我可以有50个线程并行运行

  • 每个线程将负责解析JSON文件,这可能会导致另一个性能瓶颈,因为我们要解析4999个节点。所以我想一次再读取100个节点,这将再次导致50个子线程

  • 因此,系统中总共将有2500个线程,但应该有助于并行执行大约25000000个顺序操作


    让我知道这种方法听起来是否合适?

    您所描述的不应该花费太多时间(30-50分钟来解析),而且一个具有~5k节点的json文件相对较小。 在大规模插入期间,瓶颈将出现在数据库中,尤其是在字段上有索引的情况下

    因此,我建议:

  • 不要把时间浪费在线程上——在您的情况下,解包和解析JSON应该很快,重点放在bath插入上并正确地完成:1000+批处理队列和之后手动提交
  • 导入前禁用索引,尤其是全文索引,导入后启用(+重新索引)

  • 我认为,性能问题可能来自:

  • JSON解析&创建对象
  • 向数据库插入数据:如果插入多次,性能会降低很多
  • 如果你运行2500个线程,如果你没有太多的CPU,这可能是无效的,因为开销可能会增加。根据您的硬件配置,您可以定义线程数

    要将数据插入数据库,我建议按以下步骤操作:

    • 在JSON解析和创建对象之后,每个线程都将对象放入CSV文件中
    • 完成后,尝试将CSV导入数据库
      • 我建议您使用图书馆。使用DSM,您可以轻松解析非常复杂的JSON文件,并在解析过程中对其进行处理。 您不需要等到所有JSON文件都在处理。我想这是你的主要问题。 顺便说一句: 它使用Jackson stream API来读取JSON,因此占用的内存非常少

        示例用法可在以下答案中找到:


        measure,别猜你说“我有一些代码;我怎样才能让它更快?”。您没有显示代码,也没有显示慢部分所在位置的度量。请使用探查器找出流程的哪个方面(方法调用堆栈)占用了大部分时间。将结果编辑到您的问题中。告诉我们您正在使用哪个库/框架进行JSON解析和数据库插入。向我们展示示例代码。没有这些信息,你就不能指望得到有用的答案,只能靠猜测。好的,衡量一下,这个过程中最耗时的部分是什么(记住阿姆达尔的low)2。如果JSON解析占用了大量时间,那么根本不要使用对象映射,使用基于事件/令牌/流的解析将新的insert添加到JDBC批处理中,并为每个节点动态添加PreparedStatement 3。调整数据库以提高插入的性能(运行前优化甚至删除索引、共享数据库、使用SSD等)。4.找到作业的最佳线程数,由于上下文切换、IO/内存总线和其他冲突,2500个线程可能会降低系统速度。。。