mongodb千万级数据查询等待问题

0011_mongodb千万级数据查询等待问题

  • 从师兄那里拿到一个数据库有上千万条数据,由于其存储格式有些不正规,于是发现正则查询一个里面不存在的数据需要大量时间
  • 于是通过阅读源代码注释发现可以通过设置超时指标和抛出异常的方式跳过这些不存在的数据,以节省时间效率
# 查询relay是否在traceroute中

# 导入模块
import pymongo
# 连接数据库
client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
db = client["traceroute"]  # 注意这里是中括号不是圆括号
# 读取数据
col = db["traceroute"]
i = 0
with open(r'.\1113_jp.txt', 'r', encoding='utf-8') as lines:     
    for line in lines:
        c = line.split('.')
        d = c[0] + '.' + c[1] + '.' + c[2]  #此处我是想查询/24子网          
        try:
            res = col.find_one({"traceroute": {"$regex": '^' + d + ".*?"}}, max_time_ms=30000,no_cursor_timeout=True)  #设定30s的单次查询上限时间,并设置游标永不超时(生产环境请勿这样操作,因为一旦程序因为意外终止,mongodb会需要被重启,否则这些游标会一直留在MongoDB上,占用资源)
        except pymongo.errors.ExecutionTimeout as identifier:
            i += 1
            with open(r'.\trace_node.txt', 'a', encoding='utf-8') as outlines:
                outlines.write('第' + str(i) + "个ip——" + line.strip() + ': 数据库查找超时' + '\n')
        else:            
            i += 1
            with open(r'.\trace_node.txt', 'a', encoding='utf-8') as outlines:
                outlines.write('第' + str(i) + "个ip——" + line.strip() + ': 已找到 ' + str(res['traceroute']) + '\n')

注一:主要代码

res = col.find_one({"traceroute": {"$regex": '^' + d + ".*?"}}, max_time_ms=30000,no_cursor_timeout=True)  #设定30s的单次查询上限时间,并设置游标永不超时(生产环境请勿这样操作,因为一旦程序因为意外终止,mongodb会需要被重启,否则这些游标会一直留在MongoDB上,占用资源)

注二:一些重点
利用try+except+自行抛出异常以达到快速开始下一次查询的目的
效果如下:
tracenode查询情况

参考文章:MongoDB游标超时问题的4种解决方法

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值