记一点MongoDB的坑

1、exceed quota

如果导入库时,库文件大小超过6.4g就报错exceed quota,就删除mongodb.conf中的这几行:

quota:
  enforced: false
  maxFilesPerDB: 8

鬼晓得啥原因,改false没用,非得删了或加注释才能“配额无上限”
下面是一份完整的mongodb.conf文件,记得改下数据和日志的存储位置:

systemLog:
   destination: file
   path: 'E:\Database\Logs\mongodb.log'
   logAppend: true
   quiet: true
storage:
   dbPath: 'E:\Database\mongodb'
   journal:
      enabled: true
   directoryPerDB: true
   engine: mmapv1
   mmapv1:
      preallocDataFiles: true
      nsSize: 32
#      quota:
#         enforced: false
#         maxFilesPerDB: 8
      smallFiles: false
      journal:
         debugFlags: 1
         commitIntervalMs: 100
net:
   bindIp: 127.0.0.1
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false
#wiredTiger:
#   engineConfig:
#      cacheSizeGB: 10
#      directoryForIndexes: true
#   collectionConfig:
#      blockCompressor: zlib
#   indexConfig:
#     prefixCompression: true
2、存储大量数据

不要insert_one,而要insert_many

import os,re,time
from pymongo import MongoClient


# 数据库连接
client = MongoClient('mongodb://localhost:27017')
database = client.rmb
collection = database.testdb

# 添加数据
path = "E:\BaiduNetdiskDownload\8亿Q绑"
i = theSum = 0
start = lastTime = time.time()

def getPass():
    collections = database.list_collections()
    results = [1,2,3,4,5,6,7,8,9,10,33,34,35,36,37,38,39,40,]
    for item in collections:
        col = item['name']
        if col.startswith("qqphone_"):
            results.append(int(col.replace("qqphone_",""))+1)
    results.sort()
    thePass = []
    for result in results:
            thePass.append('6.9更新总库_%02d.txt' % result)
    return thePass

files = os.listdir(path)[::-1]
for seq,file in enumerate(files):
    exec("collection = database.qqphone_{}".format(39-seq))
    thePass = getPass()
    if file in thePass:
        print("跳过文件:",file)
        continue
    with open(os.path.join(path,file)) as f:
        lines = f.readlines()
    thelen = len(lines)
    print(file,"共"+str(thelen)+"条数据")
    data = []
    for line in lines:
        if not line.strip():continue
        info = re.match("(^\d+).*?(\d+$)",line.strip())
        qq = info.group(1)
        phone = info.group(2)
        if len(phone) != 11:continue
        data.append({
            'qq':qq,
            'num':phone,
        })
        length = len(data)
        if length%100000 == 0:
            theSum = theSum+length
            collection.insert_many(data)
            i = i+1
            now = time.time()
            print(str(i)+"0 万条,累计用时 "+"{:.1f}".format(now-start)+" 距离上次 "+"{:.1f}".format(now-lastTime)+" 进度 "+'{:.2f}%'.format(theSum/thelen*100))
            lastTime = time.time()
            data.clear()
    collection.insert_many(data)
    print("最后插入",len(data))
    i = theSum = 0
    print("*"*15,file,"*"*15)

3、备份与恢复

备份

mongodump.exe -h IP地址 --port 端口号 -d 数据库名 -o 备份路径

恢复

mongorestore.exe -h IP地址 --port 端口号 -d 数据库名 --dir 数据路径
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值