我正在尝试处理一个包含大约100万条记录的大型CSV文件,在读取行(行/行或块)之后,我需要将其推送到camel-flatpack,以创建包含字段名及其值的映射。
我的要求是将所有CSV记录提供给一个扁平打包配置,并从中生成一个java.util.map。
在stackoverflow上有几个帖子通过拆分器来解决这个问题,但我的过程工作得很快,直到有近35000条记录,但此后它就变慢了。
我甚至尝试添加一个油门,它仍然不起作用。我得到了一个GC内存不足的错误。我甚至打开了我的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>发布于 2014-08-01 22:24:53
一个潜在的问题是,当您创建散列映射并不断向其中添加数据时,它需要重新创建散列。例如,如果我有大小为3的散列,并在其中输入0,1,2, 3,假设我的散列函数是mod 3,那么3将被分配给零槽,从而造成溢出,因此我需要存储溢出或重新创建一个新的散列。
我确信这就是java实现其hashmap的方式,但是您可以尝试将hashmap的初始容量初始化为有多少条记录。
https://stackoverflow.com/questions/25082291
复制相似问题