Java8 使用 easyExcel 导入 4g 大小的 csv 文件

31 天前
 jiangboyueplus
粗略观测,在没完成导入前内存占用已经超 48g 。粗略估算好像是因为我需要将所有的行记录都放到一个 list ,最后聚合处理,这个 list 至少有 9 千万条以上的记录。

以上,何解?

1.多次读取 每次只保存需要聚合的数据的一部分.缺点,同一个文件要读好多次 预计会非常耗时

2.每次读取一行记录都存入数据库,最后从数据库取用。缺点,需要额外的数据库表结构,且 mysql 单表存储也会有查询压力(可以考虑分表,但这个方案挺麻烦的)
2539 次点击
所在节点    Java
23 条回复
imzhoukunqiang
31 天前
改动量最小的方案,用 mapdb ,把 list 映射到磁盘。
512357301
31 天前
对 Java 不熟,我的方案:
纯本地,sqlite 或 duckdb 或同类型方案
100 并发以内,clickhouse 或同类型 olap 方案
100 以上并发,出门左转找数据团队。
jiangboyueplus
31 天前
@imzhoukunqiang 作为一个数据导入的需求,我就喜欢改动最小的方案。我去了解下
sagaxu
30 天前
大 csv 不要用 easyExcel 读,用 commons csv ,CSVParser 可以迭代器访问,不用全部载入内存

边读边聚合,一次汇总完所有指标,同一个文件只读一次

分表是分布到多个机器利用集群性能,或者把冷热数据分离降低规模,此处不适用
perbugwei
30 天前
9 千万条数据,那必然爆。
存到 mysql ,超过两千万也有问题。
不改程序,操作一下 csv ,把 csv 分割成多个 sheet 。
luozic
30 天前
这明显是 duckdb 的场景,关键是 duckdb 用得多案例多,mapdb 维护都没看到什么了
cslive
30 天前
shell 直接导入 csv 文件
Arivan996
30 天前
最核心的问题不是所有的数据都在内存中没做处理吗?
Karte
30 天前
核心问题是你要拿这些数据做什么?
Karte
30 天前
有谁会把 9 千万条数据一起做聚合的? 分批次聚合都能解决问题.
BBCCBB
30 天前
easyexcel 也是可以增量解析的, 你的问题在于要把所有数据都加到内存里.
winglight2016
30 天前
lz 不说完整的需求,这个问题无解

如果是纯聚合计算,用 spark 吧
beetlerx
30 天前
这不是 1BRC 很像么 看看这个
https://www.cnblogs.com/thisiswhy/p/18051585
dooonabe
30 天前
需求太模糊了
wxf666
30 天前
@luozic #6 感觉 DuckDB 读文件时,性能有点问题?


感觉 DuckDB 读空缓冲区后,Writer 才能继续写。写满后,DuckDB 才去读一样?

同样的内容,会因喂给 DuckDB 的姿势不同,表现出不同的速度差异。。

就像 Python 的假多线程一样,只能有一个线程活跃。。

yazinnnn0
30 天前
边读边算呗, 为啥要全读完
luozic
30 天前
@wxf666 你是是把 duckdb 当 sqlite 用了
xubeiyou
30 天前
@beetlerx 看完了 这个确实不错 这么一想 都是写 Java 的差别是真 TMD 巨大
Vegetable
30 天前
有点抽象了,一个导入的需求而以,非得读到内存全量操作,就没有什么流式处理的可能吗?
credo123
22 天前
@beetlerx 这个我也看了,很牛.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1033092

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX