首页 > 解决方案 > Apache Camel 内存不足异常

问题描述

我有一个总大小的.csv文件。25Gb我正在尝试(现在逐行)阅读它,但是我一直遇到一个OutOfMemoryError: Java heap space,我不知道为什么。谷歌搜索了一段时间后,我想出了以下代码

from("file:/home/justin/data/?fileName=in.csv&noop=true")//.streamCaching()
    .split().tokenize("\n", 10000000).streaming()
    .unmarshal(csv)
    .process(new CsvParserProcess())
    .marshal(csv)
    .to("file:/home/justin/data/?fileName=out.csv").log("Finished Transformation").end();

运行 5 秒后是我遇到OutOfMemoryError

我的直觉会告诉我“哦,当你接近完全的内存饱和时,清除旧的未使用的内容”但是我不确定如何在 ApacheCamel 的上下文中执行此操作(或者真的在 java 中手动进行迁移) C)

我的另一个解决方案是一个非常昂贵的蛮力选项,只需将文件从骆驼的流端点一次一行地管道(?)到流中,这可能有效吗?我只是不想坐在那里等待它完成。

from("stream:file?fileName=/home/justin/data/in.csv")
    .streamCaching().split().tokenize("\n")
    .unmarshal(csv)
    .process(new CsvParserProcess())
    .marshal(csv)
    .to("file:/home/justin/data/?fileName=out.csv&fileExist=Append").log("done").end();

有没有人知道如何避免 MemoryError?

编辑:我忘记了.streaming()在我标记文件后我的“改进”代码。但是,它仍然会导致相同的错误:(

标签: javafilestreamapache-camelout-of-memory

解决方案


也许在我扯掉我的头发之前(并且去互联网上我永远无法看到的地方)我应该也许应该对奥卡姆剃须刀进行一些研究......结果我不能像我最初想象的那样数数我创建的大小为 10000000 的缓冲区实际上应该是 1000000 ....


推荐阅读