当前位置: 首页 > 知识库问答 >
问题:

Spring批处理-性能调整

孙鑫鹏
2023-03-14

我们开发了一个Spring批处理应用程序,其中我们有两个流程。1.向前2.向后。我们只使用文件读/写,不涉及数据库。

>

  • 正向场景:输入文件将包含22个字段的记录。通过执行序列号生成和添加一些填充字段等操作,将22个字段转换为32个字段。根据国家代码,输出将被分成最多3个。每个块将有250K条记录。(如果记录以百万为单位,则将为同一国家生成多个文件)。

    800万张唱片需要36分钟。

    800万记录将在单个文件中。

    我们使用的是Spring批Thread1000个我们正在使用的Thread。

    反向流动:输入文件中每个记录有82个字段。这82个字段将被转换为86条记录。这两个字段将添加到中间,这两个字段取自正向流输入文件。其他字段只是简单地复制和粘贴。错误记录也要写入错误文件。错误记录只不过是向前流动的实际输入记录。为了跟踪,我们将保留序列号

    输入文件的最大大小为250K。

    800万记录了它需要1小时8分钟,这太糟糕了。32个文件(每个250K)将在这个流中输入。没有向后使用线程。我不知道线程的使用情况会如何。我试过了,但进程挂起了。

    服务器配置:

    >

  • 12 CPU

    你们能在这方面帮助提高性能吗,因为我们有12个CPU/64GB RAM。

  • 共有1个答案

    子车鸿才
    2023-03-14

    您已经使用了1000个线程,这是一个非常高的数字。我已经微调了spring批处理作业,这就是我所做的1。减少网络流量——尽量减少每个进程中对数据库或文件系统的调用次数。你能一次获得所有可能的信息并将其保存在内存中以供线程使用吗?我有一个组织。阿帕奇。平民收藏。地图用于存储和检索数据的多键地图。例如,在你的情况下,你需要序列号比较。所以,在开始这个过程之前,把所有序列号都放到一张地图上。您可以将ID(如果不是太多)存储到步骤执行上下文中。

    >

    将进程结束时未使用的对象设置为null以加快GC

    通过VisualVm或Jconsole检查GC频率。当进程运行时,您应该会看到频繁的GC发生,这意味着正在创建对象并进行垃圾收集。如果你的记忆图持续增加,那就有问题了。

     类似资料:
    • 我们有一个spring批处理作业,我们试图处理大约1000万条记录。现在,在单线程中执行此操作将非常慢,因为我们必须匹配SLA。 为了提高性能,我们开发了一个POC,其中主步骤是创建分区,每个分区代表一个唯一的prod ID。这可以从500到4500之间的任何地方。在POC中,我们有500个这样唯一的产品ID。现在,每个分区都有一个prod id和一个步骤。所有这一切都很顺利。 我们注意到的是主步

    • 问题内容: 我需要将几亿条记录插入mysql db。我要一次插入一百万个。请在下面查看我的代码。它似乎很慢。有什么方法可以优化它吗? 问题答案: 我在mysql中遇到类似的性能问题,并通过在连接URL中设置useServerPrepStmts和rewriteBatchedStatements属性来解决。

    • 我无法在使用JPA的Spring启动应用程序中记录Spring批处理日志。这是属性文件配置(application.properties)。我想看看应用程序是否从日志中创建了Spring批处理表。 https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/resources/org/

    • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

    • 我们在POC中使用远程分区,处理大约2000万条记录。为了处理这些记录,slave需要一些大约5000行的静态元数据。我们当前的POC使用EhCache从数据库一次将元数据加载到从机中,并将其放入缓存中,这样子用户调用就可以从缓存中获取这些数据,从而获得更好的性能。 现在,由于我们使用远程分区,我们的从机大约有20个MDP/线程,因此每个消息侦听器首先调用以从数据库获取元数据,因此基本上每个远程机