2

我正在尝试处理一个包含大约 100 万条记录的大型 CSV 文件,在读取行(行/行或块)之后,我需要将其推送camel-flatpack以创建包含字段名称及其值的映射。

我的要求是将所有 CSV 记录提供给 flatpack 配置并从中生成 java.util.map。

stackoverflow 上有几篇文章通过拆分器解决了这个问题,但我的过程运行速度很快,直到近 35000 条记录,但此后速度变慢。

我什至尝试添加一个节流器,它仍然不起作用。我收到 GC 内存不足错误。我什至把我的JAVA_MIN_MEM, JAVA_MAX_MEM, JAVA_PERM_MEM,JAVA_MAX_PERM_MEM但结果是一样的。Hawtio 控制台显示JAVA_HEAP_MEMORY大约 5-6 分钟后超过 95%。

这是我的代码片段:

    <route id="poller-route"> 
        <from uri="file://temp/output?noop=true&amp;maxMessagesPerPoll=10&amp;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>
4

1 回答 1

0

一个潜在的问题是,当您创建哈希映射并不断向其中添加数据时,它需要重新创建哈希。例如,如果我有大小为 3 的散列,并在其中输入 0,1,2,3,假设我的散列函数是 mod 3,则将三个分配给零槽,从而产生溢出,所以我要么需要存储溢出或重新创建一个新的哈希。

我确定这就是 java 实现其 hashmap 的方式,但您可以尝试将 hashmap 的初始容量初始化为有多少条记录。

于 2014-08-01T14:24:52.750 回答