我正在尝试处理大约1百万条记录的大型CSV文件,在读取行(行/行或块)后,我需要将其推送到camel-flatpack
以创建带有字段名称的地图,他们的价值观
我的要求是将所有CSV记录提供给flatpack配置并从中生成java.util.map。
stackoverflow上有几个帖子可以通过拆分器来解决这个问题,但我的过程可以快速运行直到35000条记录,但此后它会变慢。
我甚至尝试添加一个节流器,它仍然无法正常工作。我得到GC Out of Memory错误。我甚至提出了我的JAVA_MIN_MEM
,JAVA_MAX_MEM
,JAVA_PERM_MEM
,JAVA_MAX_PERM_MEM
,但结果是一样的。 Hawtio控制台显示约5-6分钟后JAVA_HEAP_MEMORY
超过95%。
这是我的代码段:
<route id="poller-route">
<from uri="file://temp/output?noop=true&maxMessagesPerPoll=10&delay=5000"/>
<split streaming="true" stopOnException="false">
<tokenize token="\n" />
<to uri="flatpack:delim:flatpackConfig/flatPackConfig.pzmap.xml?ignoreFirstRecord=false"/>
</split>
</route>
<route id="output-route">
<from uri="flatpack:delim:flatpackConfig/flatPackConfig.pzmap.xml?ignoreFirstRecord=false"/>
<convertBodyTo type="java.util.Map"/>
<to uri="mock:result"/>
</route>
答案 0 :(得分:0)
一个潜在的问题是,当您创建哈希映射并不断向其添加数据时,它需要重新创建哈希值。例如,如果我有大小为3的哈希值,并输入0,1,2,3,假设我的哈希函数是mod 3,则将三个分配给零槽,从而产生溢出,所以我要么需要存储溢出或重新创建新哈希。
我确信这是java实现其hashmap的方式,但您可以尝试将hashmap的初始容量初始化为有多少记录。