一. 問題概述
今天看看爬蟲抓取的數據,發現數據無法插入,首先想到的就是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上看到一個提問及回答,貼出來給大家參考:
三. 驗證問題
1. 檢查當前Mongo的構建是32bit還是64bit版本
使用mongo工具,進入到shell模式
1 root@192.168.86.223:~$ mongo
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://blog.csdn.net/chaijunkun/article/details/7236911
http://blog.mongodb.org/post/137788967/32-bit-limitations
文章列表