java - 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()
在我标记文件后我的“改进”代码。但是,它仍然会导致相同的错误:(
解决方案
也许在我扯掉我的头发之前(并且去互联网上我永远无法看到的地方)我应该也许应该对奥卡姆剃须刀进行一些研究......结果我不能像我最初想象的那样数数我创建的大小为 10000000 的缓冲区实际上应该是 1000000 ....
推荐阅读
- perl - 如何从 anaconda 修复 Perl 而不安装 bioperl?`拯救 BioPerl-1.007002 的安装。`
- django - 将多边形或线保存到数据库 django/mapbox
- git - 使用 github 操作通过 git push production 推送生产
- python - Docplex 添加约束太慢
- java - Java比较值,最好的方法
- multithreading - 多线程实现中的错误
- symfony - Doctrine(Symfony4) 将数据存储为无效的 HEX 值
- javascript - Vuejs动态输入绑定和计算不是一个函数
- python - 在循环中比较相邻列中重复的行值以清理熊猫中的数据
- c# - 在 C# 中插入具有重复记录列的 BigQuery 行