Apache Camel内存不足异常

时间:2018-07-19 09:52:23

标签: java file stream apache-camel out-of-memory

我有一个.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()。但是仍然会导致相同的错误:(

1 个答案:

答案 0 :(得分:0)

也许在我扯掉头发(去到我永远都看不见的互联网上的地方)之前,我应该对霍克汉姆剃刀进行一些研究。……事实证明,我无法数数我最初以为,我正在创建的大小为10000000的缓冲区实际上应该是1000000。...