我们开发了一个弹簧批量应用程序,其中我们有两个流程。 1.前进2.后退。我们只使用文件读/写而不涉及DB。
转发场景:输入文件将包含22个字段的记录。通过执行序列号生成和添加少量填充字段等操作将22个字段转换为32个字段。根据国家/地区代码,输出将被分成最大3个。每个块将有250K记录。 (如果记录以百万为单位,将为同一国家生成多个文件)。
800万记录它需要36分钟。
8百万条记录将以单个文件存储。
我们正在使用弹簧批量线程1000线程。
向后流:输入文件每个记录有82个字段。这82个字段被转换为86个记录。将在两者之间添加两个字段,这两个字段取自Forward flow输入文件。其他字段只需复制和粘贴即可。错误记录也要写入错误文件。错误记录只是前向流的实际输入记录。跟踪我们是否持续序列号和&文件中的实际记录,这是在前向流本身完成的。我们正在向后流中获取持久性文件并比较序列号(如果缺少任何内容),那么我们通过键,值对写入错误记录。该过程在完成后向流程后完成。
输入文件的最大大小为250K。
800万记录它花了1小时8分钟这太糟糕了。 32个文件(每个250K)将在此流程中输入。 向后没有使用线程。我不知道线程的使用方式。我试过但是这个过程被挂了。
服务器配置:
12 CPU& 64 GB Linux服务器。
由于我们有12个CPU / 64GB RAM,你们可以帮助改善性能吗?
答案 0 :(得分:0)
您已经使用了1000个线程,这是一个非常高的数字。我有很好的调整弹簧批量工作,这就是我所做的 1.减少网络流量 - 尝试减少每个进程中对数据库或文件系统的调用次数。你可以一次性获得所有信息并将其保存在内存中以供线程使用吗?我使用org.apache.commons.collections.map.MultiKeyMap来存储和检索数据。 例如,在您的情况下,您需要序列号比较。因此,在开始此过程之前,请将所有序列号放入一个映射中。您可以将ID(如果不是太多)存储到步骤执行上下文中。
写频率较低 - 继续存储您需要写入的所有信息一段时间,然后在最后写下。
将进程结束时未使用的对象设置为null以加快GC
通过VisualVm或Jconsole检查GC频率。当进程运行时,您应该看到频繁发生GC,这意味着正在创建对象并收集垃圾。如果你的记忆图表不断增加,那就错了。