对约 35g 的数据去重

2020-02-04 10:23:01 +08:00
 fields
数据占了 35g 左右存储,有标识每条数据的 id,还剩大约 7g 空闲空间,需要对这 35g 的数据去重,内存是 8g 的.如何对数据进行去重?
4477 次点击
所在节点    问与答
34 条回复
alalida
2020-02-04 10:33:49 +08:00
你先想一想目标时间复杂度和空间复杂度。去重意味要查找,那最好也就对数时间复杂度。此外要看能否分批处理,数据有无规律。可以分批处理也会快很多。总之要先看数据长什么样。
otakustay
2020-02-04 10:36:13 +08:00
数据是 35G,其中 id 部分有多大?不大的话哈希应该是有办法建起来的……
shuangyeying
2020-02-04 10:39:03 +08:00
是裤子么?
opengps
2020-02-04 10:39:44 +08:00
去重字段仅仅是 id 字段?还是全字段匹配?
malusama
2020-02-04 10:44:37 +08:00
bloomfilter 有误差率
fields
2020-02-04 10:50:10 +08:00
@opengps 每个 id 字段标识这条数据
fields
2020-02-04 10:50:23 +08:00
@shuangyeying 不是的,亲
fields
2020-02-04 10:51:43 +08:00
@alalida 在用分片,时间换空间,但很慢,每次 10w 条
fields
2020-02-04 10:52:31 +08:00
@malusama 有空间限制的
fields
2020-02-04 10:53:41 +08:00
@alalida 经过分析,每条数据里边的 id 唯一标识这条数据
wysnylc
2020-02-04 11:11:07 +08:00
把 id 提出来,还能有 35g ?
ho121
2020-02-04 11:17:06 +08:00
对每条数据 hash 后存到哈希表或者二叉树中。
hash 算法也不需要碰撞率很低的那种,比如 crc32,crc64 这种简单的就行,这样可以加快 hash 速度,并减少内存使用。当碰到 hash 相同的,需要做完全匹配来判断数据是否真的是相等。
哈希表或者二叉树每个节点要存下每个 hash 对应的 id (可能有多个)。

数据用流式读取,或者扔进数据库中。


手机码字,有点乱
grimpil
2020-02-04 11:18:08 +08:00
还以为是 35 克数据
fields
2020-02-04 11:22:23 +08:00
@grimpil 哈哈哈哈哈哈
keepeye
2020-02-04 11:24:07 +08:00
遍历所有数据,id 字段走布隆过滤器去重 用不了多少内存
mxT52CRuqR6o5
2020-02-04 11:26:58 +08:00
Bitmap
binux
2020-02-04 11:29:05 +08:00
如果数据>>id,拿 id 出来随便爱怎么搞怎么搞
如果数据就是 id,每 7g 分片排序再 merge 排序。
zengguibo
2020-02-04 11:57:32 +08:00
如果只是文本数据,压缩一下传到性能强内存大的机器上,直接导入内存去重
Tlvncks
2020-02-04 12:06:51 +08:00
引用;@grimpil #13 还以为是 35 克数据

-------------------------------------------------------
我也看了半天,还在想 35g 啥玩意?难道想提纯??
Rekkles
2020-02-04 12:19:26 +08:00
数据 hash 然后对比去重?
有个笨一点的办法,数据导入 db 做唯一索引 一条一条导入,导入失败的就是重复的,牺牲时间换空间。

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

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

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

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

© 2021 V2EX