一. 问题概述
今天看看爬虫抓取的数据,发现数据无法插入,首先想到的就是32Bit构建的文件大小限制问题,检查一下还真的是。本文把整个检查问题,解决问题的过程记录下来。
问题:can't map file memory - mongo requires 64 bit build for larger datasets
错误信息如下:
二. 起源
1. 先来看看MongoDB官网上的描述
http://blog.mongodb.org/post/137788967/32-bit-limitations
简而言之,Mongo官方是为了:
(1)维持代码的清晰、简洁;
(2)大量减少bug;
(3)快速发布1.0版本;
而选择不支持2GB的文件在32bit系统上。
我们写代码很重要的一点不就是Trade off么? 折中的选择,我们应该理解的。
2. 再来看看Mongo的README文件
既然人家都已经一再强调了,那么当我们遇到文件大小限制问题的时候只能怪自己当初没有看清楚~
不过你的服务器是32-bit的,又想存大数据,那可以考虑Sharding的方法,但是每个分片的大小也是2GB的限制。
关于这一点,我在Stack-Overflow上看到一个提问及回答,贴出来给大家参考:
http://stackoverflow.com/questions/13578842/cant-map-file-memory-mongo-requires-64-bit-build-for-larger-datasets
三. 验证问题
1. 检查当前Mongo的构建是32bit还是64bit版本
使用mongo工具,进入到shell模式
1 root@192.168.86.223:~$ mongo
2 MongoDB shell version: 2.0.4
3 connecting to: test
4 > use admin
5 switched to db admin
6 > db.runCommand("buildInfo")
7 {
8 "version" : "2.0.4",
9 "gitVersion" : "nogitversion",
10 "sysInfo" : "Linux yellow 2.6.24-29-server #1 SMP Tue Oct 11 15:57:27 UTC 2011 x86_64 BOOST_LIB_VERSION=1_46_1",
11 "versionArray" : [
12 2,
13 0,
14 4,
15 0
16 ],
17 "bits" : 32,
18 "debug" : false,
19 "maxBsonObjectSize" : 16777216,
20 "ok" : 1
21 }
发现问题了,原来我使用的是32bit的构建,那就去下载64bit的呗。
2. 验证大小限制是作用在database上
之前一直有个疑问,到底这个文件大小的限制是作用在A.左右DB的总大小;B.单个DB的大小;C.单个Collection的大小上呢?
借着这个契机,我验证了一下这个问题,最后发现大小的限制是作用在B.单个DB的大小上的。
如何验证?只需要往这个出问题的DB上继续塞数据,塞不进;往其它数据库上塞数据,能塞进去。就知道了。
四. 解决问题
1. 备份生产环境上的数据库,或者导出一份
2. 移除原来的32-bit Mongo
3. 安装64-bit Mongo
4. 导入备份出来的数据
5. 验证当前Mongo的构建版本(见三.1)
五. 参考文章
http://stackoverflow.com/questions/13578842/cant-map-file-memory-mongo-requires-64-bit-build-for-larger-datasets
http://blog.iyunv.com/chaijunkun/article/details/7236911
http://blog.mongodb.org/post/137788967/32-bit-limitations
|