我有一个.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()
。但是仍然会导致相同的错误:(
答案 0 :(得分:0)
也许在我扯掉头发(去到我永远都看不见的互联网上的地方)之前,我应该对霍克汉姆剃刀进行一些研究。……事实证明,我无法数数我最初以为,我正在创建的大小为10000000的缓冲区实际上应该是1000000。...