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

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

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

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

极低概率去掉非重复行,几乎可以忽略。
rrfeng
25 天前
那就 bloomfilter 先过一遍看看情况。

要硬算的话,就分块排序,排完序就好处理了。排序前记录下序号,最后还原一下顺序。
hbcolorful
25 天前
redis 的布隆过滤器可以考虑下
xxfye
25 天前
@drymonfidelia 看错了,还以为是 6GB 的 csv 文件在线处理呢,那确实不适合 duckdb 。

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

203 亿行 csv 有那么大吗,我们每天备份全量的 17 亿行信息,保留几十天,用 orc 存储,也就几百 G 。
kneo
25 天前
感觉可以试试 clickhouse 。
yinmin
25 天前
使用 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