mongoDB大数据查询坑

面对30亿量级的数据,使用limit().skip()方法在MongoDB中遇到性能问题。skip在大数据查询时效率低下,导致进程阻塞或死掉。解决方案包括利用索引进行升序或降序查找,避免大量skip操作,以及采用多线程或分布式计算来提高效率。通过预爬取获取_id值进行数据分桶,进一步优化查询过程。
摘要由CSDN通过智能技术生成

有一个30亿量级数据的库,如何全量爬取并分析?

因为量级过大无法一次性爬取至本地再分析,考虑使用limit().skip()混合的方法,一次读取1万条数据进行分析存储,30亿数据分成30万份后再合并分析生成最后的结果。代码如下:

// i为跳跃条数,比如取第一个1万条时i为0,第二个1万条时i为1

db.getCollection("whois").find({}).limit(10000).skip(i*10000)

30个进程并发计算,一个进程负责1万份的量级。简单测试了下读取速度,非常快,几乎一秒读取数据,剩下的就是cpu本地计算的事儿了,预计8个小时完成,锁屏,下班。第二天来一看,发现了很奇怪的现象。

1.一天过去,数据只跑了2亿条左右。

2.大部分进程阻塞或者死掉。

3.前几个进程爬取的数据远远多于后面的进程,比如第一个进程的一万份数据基本上爬取完毕,第二个进程爬取了大半,第三个进程及以后非常的少甚至没有数据。

出现以上现象的原因:

skip不适用于大数据的查询搜索,数据量小的时候还可以,效率高,但是一但数据量达到一个层级(mongoDB本身提供的几十mb的内存限制)后,查询的算法会更改。比如查询limi(10000).skip(0),即前一万条数据,很快查询并返回,因为经历了很少的分页查询,但是一但你使用limit(10000).skip(1000000000),那么你会惊喜的发现查几天都出不来结果甚至直接查询失败。反复的查询数据提取到内存,一条条的数,看是否达到你想要条数,如果没有

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB 是一个面向文档的 NoSQL 数据库,它的优点包括可伸缩性强、性能出色、支持复杂数据结构等。在处理大数据量的情况下,MongoDB 的性能可能会受到影响,因此需要进行一些优化。以下是一些 MongoDB 处理大数据量的最佳实践: 1. 索引优化:在 MongoDB 中,索引是提高查询性能的关键。对于大数据集合,应该尽可能使用索引,特别是在经常查询的字段上创建索引,可以显著提高查询性能。 2. 分区集合:对于非常大的集合,将其分成多个片,每个片可以存储在不同的服务器上,这样可以提高数据访问的并行度和可靠性。 3. 使用副本集:使用副本集可以提高数据的可靠性和可用性。在副本集中,每个节点都有一个完全相同的数据副本,可以保证在节点出现故障时数据不会丢失。 4. 调整内存和磁盘空间:MongoDB 的性能与可用内存和磁盘空间有关。因此,应该合理分配内存和磁盘空间,以满足应用程序的需求。 5. 避免全表扫描:在 MongoDB 中,全表扫描是非常低效的操作。因此,应该尽量避免全表扫描,使用索引和分区集合等技术来提高查询效率。 6. 批量插入和更新:对于大数据量的插入和更新操作,应该使用批量操作,而不是单个操作。这样可以减少网络传输和数据库开销,提高插入和更新的效率。 以上是一些 MongoDB 在处理大数据量时的优化技巧,需要根据实际情况进行具体的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值