要对单个 6.20TB 的超大 csv 文件保持顺序的情况下进行去除重复行,有什么好思路?显然不可能加载进内存

2024-06-01 22:14:20 +08:00
 drymonfidelia
15617 次点击
所在节点    程序员
101 条回复
NXzCH8fP20468ML5
2024-06-01 22:21:11 +08:00
duckdb 值得拥有
dcsuibian
2024-06-01 22:24:03 +08:00
扔数据库不行吗?
opengps
2024-06-01 22:30:03 +08:00
能想到的只有数据库
buaasoftdavid
2024-06-01 22:30:13 +08:00
内存里搞个哈希表,一行一行读 csv ,哈希表碰撞了就扔掉该行,没碰撞就插入哈希表再写到磁盘
52boobs
2024-06-01 22:33:22 +08:00
表的结构是怎样的,有天然的主键吗
kneo
2024-06-01 22:36:13 +08:00
行数是多少?平均行长是多少?
去重是应该基于整行文本还是列内容?比如 1.0 和 1 是否应该算做重复?
每行前缀重复度是否够高?是否有某列( XXID )可以用于快速去重?
机器性能如何?内存有多大?
securityCoding
2024-06-01 22:38:58 +08:00
spark 干的活?
drymonfidelia
2024-06-01 22:40:30 +08:00
@kneo 行数是 203 亿,平均行长 335
去重是基于整行文本
前缀重复度不高,没有 ID
最高可以弄到 256GB 内存的服务器
phrack
2024-06-01 22:43:02 +08:00
光就这点信息说个屁呢,一行 8 个字符,是几千亿行,一行 1M 字符,是几百万行,这能一样吗?

内存也不说,4KB 内存和 4GB 内存能一样吗?
drymonfidelia
2024-06-01 22:44:17 +08:00
@phrack 8 楼补充了
rrfeng
2024-06-01 22:44:55 +08:00
去重后大概会有多少行知道吗
lifanxi
2024-06-01 22:48:21 +08:00
遍历整个文件,每行都 hash 一下,把 hash 存到一个高性能 KV 里,不重复就输出当前行,重复就跳过当前行。
drymonfidelia
2024-06-01 22:48:21 +08:00
@rrfeng 不知道
cndenis
2024-06-01 22:49:20 +08:00
如果不是要求严格不能丢数据的话, 可以用布隆过滤器去重, 误判率有公式可以算的, 有几十 GB 级别内存的话, 误判率应该比较低的
phrack
2024-06-01 22:51:26 +08:00
开启 zram ,256g 可以当作 512g 没问题。

sha1sum 一个占用 20 字节,200 亿差不多占用 372g ,没问题。

极低概率去掉非重复行,几乎可以忽略。
rrfeng
2024-06-01 22:54:00 +08:00
那就 bloomfilter 先过一遍看看情况。

要硬算的话,就分块排序,排完序就好处理了。排序前记录下序号,最后还原一下顺序。
hbcolorful
2024-06-01 22:54:24 +08:00
redis 的布隆过滤器可以考虑下
NXzCH8fP20468ML5
2024-06-01 22:54:41 +08:00
@drymonfidelia 看错了,还以为是 6GB 的 csv 文件在线处理呢,那确实不适合 duckdb 。

还是上 spark 吧,硬盘配大点就行。

203 亿行 csv 有那么大吗,我们每天备份全量的 17 亿行信息,保留几十天,用 orc 存储,也就几百 G 。
kneo
2024-06-01 22:58:02 +08:00
感觉可以试试 clickhouse 。
yinmin
2024-06-01 22:59:35 +08:00
使用 apache spark ,用 python 的 PySpark 库试试,具体可以问 gpt-4

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

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

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

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

© 2021 V2EX