我在ARM处理器上使用的是MongoDB 2.4 32位。我正在数据库中创建动态集合。我遍历了MongoDB文档,该文档指出-存储引擎MMAP预先为文件系统分配了高达2GB的磁盘空间。 32-bit MongoDB processes are limited to about 2 gb of data
这是db.stats()的输出
{
"db" : "admin",
"collections" : NumberInt(40),
"objects" : NumberInt(998),
"avgObjSize" : 196.9498997995992,
"dataSize" : NumberInt(196556), #~1MB
"storageSize" : 1478905856.0,
"numExtents" : NumberInt(42),
"indexes" : NumberInt(50),
"indexSize" : NumberInt(433328),
"fileSize" : 2197028864.0, #2GB
"nsSizeMB" : NumberInt(16),
"dataFileVersion" : {
"major" : NumberInt(4),
"minor" : NumberInt(5)
},
"ok" : 1.0
}
在这里您可以看到数据大小为1MB,但文件大小为〜= 2GB。达到2GB的文件大小限制后,不允许我创建新集合。
du -sh /data/db
2.1G /data/db/
当我尝试使用--repairpath选项修复数据库时,仍然显示错误
mongod --repair --repairpath /data/db2
错误
[initandlisten] ERROR: mmap() failed for /data/db/admin.7 len:536608768 errno:12 Cannot allocate memory
[initandlisten] ERROR: mmap failed with out of memory. You are using a 32-bit build and probably need to upgrade to 64
[initandlisten] ERROR: mmap() failed for /data/db2/_tmp_repairDatabase_0/admin.2 len:134217728 errno:12 Cannot allocate memory
[initandlisten] ERROR: mmap failed with out of memory. You are using a 32-bit build and probably need to upgrade to 64
[initandlisten] exception in initAndListen: 10084 can't map file memory - mongo requires 64 bit build for larger datasets, terminating
dbexit:
有关如何解决此问题的任何建议,
答案 0 :(得分:0)
我终于找到了这个问题的根本原因,其中fileSize为〜= 2GB,dataSize为几MB,及其解决方法。
根本原因- 如果数据库使用上限收集,则Mongodb 2.4 MMAP存储引擎将为这些上限收集分配固定数量的磁盘空间。在达到数据文件大小之后,任何尝试创建新集合的尝试都会导致Mongodb 2.4引发错误。
cant map file memory-mongo requires 64 bit build for larger datasets
就我而言,我是在动态创建上限集合。
解决方案-
使用mongod
命令修复数据库的任何操作都将失败,因为它需要额外的内存才能执行这些操作。
因此,使用mongodump
与--repair
一起获取数据库转储,这将为所有有上限的集合创建一个没有“上限”限制的转储,然后mongorestore
第1步-Take the dump of database alongwith --repair
mongodump --username <username> --password <password> --dbpath <path> --db <db> --out <path> --repair
第2步-Drop database
db.dropDatabase()
第3步-Restore the dump
mongorestore --username <username> --password <password> --dbpath <path> --db <db> <path>
第4步-Convert a Collection to Capped(Optional)
db.runCommand({"convertToCapped": "mycoll", size: 100000});
希望这会有所帮助。
欢呼