mongodb 导入数据怎么破

2020-07-29 20:55:25 +08:00
 dtgxx

数据量太大 几百亿,但是只有一台机器,存储够用。


数据需要以三个字段建联合唯一索引。


如果不建索引,导入差不多一周就完事了。 但是联合唯一索引在导入数据之后有重复数据就无法创建了,去掉重复数据也非常的难。 建索引之后再导数据,非常非常非常的慢,可能是索引影响了插入速度。。


大佬们有啥高招吗

6498 次点击
所在节点    MongoDB
34 条回复
dtgxx
2020-07-30 09:46:05 +08:00
@zhuifeng1017 #20 啊 大佬,这个哪里有说明吗,真是这样就太好啦
JCZ2MkKb5S8ZX9pq
2020-07-30 09:57:14 +08:00
@dtgxx 20 楼说的看了眼,学到了。但感觉不管哪种去重,查找的花销总归是难免的,不如先全部丢进去再说了。可以以后慢慢处理。

> 但是联合唯一索引在导入数据之后有重复数据就无法创建了
这个没有看懂,如果是 mongo 自带的 index 不是可以重复的吗?
windyland
2020-07-30 10:00:26 +08:00
所以为什么不试试阿里云开内存盘呢。。。。。。?
dtgxx
2020-07-30 10:02:45 +08:00
@JCZ2MkKb5S8ZX9pq #22 先导入数据,然后添加唯一索引,被索引的字段如果有重复,这个索引就会建失败。
JCZ2MkKb5S8ZX9pq
2020-07-30 10:14:04 +08:00
@dtgxx 是用

createIndex({name:1,gender:1,age:1})
如果是这种是可以重复的吧?

加了{unique: true}的话倒不清楚,没用过这个,查询会更快吗?
我去试试看这个。

也可以考虑初期先导入,用起来再说,日后慢慢去重做 unique 吧。
dtgxx
2020-07-30 10:16:50 +08:00
@JCZ2MkKb5S8ZX9pq #25 联合唯一索引,唯一指的就是 unique 。
JCZ2MkKb5S8ZX9pq
2020-07-30 10:32:27 +08:00
@dtgxx 嗯,看了下的确没有先 compound 然后再转换的方法。那就等于全部数据要预处理,那是怎么都快不起来了。
去重的话感觉也是先建非 unique 的 index,然后排序去重能快一点。不过你这个量是满夸张的。
wupher
2020-07-30 11:08:55 +08:00
只有单条重复性不多的情况可以用这种方法。

如果单条数据重复数量级很大,那就不适合了。

几百亿也可以考虑放 ES 或者 Cassandra
dtgxx
2020-07-30 15:37:27 +08:00
@zhuifeng1017 #20
引用:用 mongoimport 导入 csv 或 tsv,重复数据会自动跳过的
这个你自己试过吗?我刚测试了,并不可以。

@wupher 是 之前考虑用分布式大数据存储之类的,最终机器限制,就没搞。
joApioVVx4M4X6Rf
2020-07-30 18:07:53 +08:00
假设数据有 500 亿。
首先对数据对三个联合主键做一个取余,假设是模 10000,这样数据被分成了 10000 份,平均每份 500w 数据,所以只需要对这 500w 数据去重就行了,做好后直接插入数据库,不用建立唯一索引
smallgoogle
2020-07-30 18:36:35 +08:00
哎。别说了。才弄完。5 亿数据。
dtgxx
2020-07-30 18:43:17 +08:00
@v2exblog #30 没太明白,把数据分成 1 万份,不也需要每一份都去重吗。
@smallgoogle 共勉老铁。
kuafou
2020-08-08 14:36:27 +08:00
@dtgxx 问题解决了吗?
dtgxx
2020-08-08 15:16:43 +08:00
@kuafou #33 只能导入之后,去重,再建索引,去重也非常慢,不过目前没有别的好办法。去重虽然慢,但是要远远快于提前建好索引的情况。

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

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

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

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

© 2021 V2EX