2011-05-30 45 views
2

我寫了一個簡短的Ruby腳本來配置MongoDB,只是爲了看看我的磁盤空間如何增加記錄。我希望它能夠創建100,000,000條記錄,但插入操作在7,000,000之後默默地開始失敗。任何想法爲什麼?下面是代碼:Rails的MongoDB驅動程序無法插入而沒有錯誤

#!/usr/bin/env ruby 

require 'rubygems' 
require 'mongo' 

@conn = Mongo::Connection.new 
@conn.drop_database('benchmark') 
@db = @conn['benchmark'] 
@reqs = @db['requests'] 

last_count = 0 
last_elapsed = 0 
total_elapsed = 0 

puts 
puts "inserts\tsize\tt_elapsed\tt_per_insert" 

print_at = [ 
    1, 
    1000, 
    # ... 
    7_000_000, 
    8_000_000, 
    # ... 
].inject({}) {|h,x| h[x] = 1; h} 

1.upto 100_000_000 do |i| 
    req = {'user_id' => i, 
     'role_name' => 'user', 
     'day' => [2011,5,30], 
     'method' => 'get', 
     'page' => 'http://www.example.com/users/5/edit', 
     'referrer' => 'http://www.example.com/projects/57/notes'} 
    t1 = Time.new 
    @reqs.insert(req) 
    t2 = Time.new 
    total_elapsed += t2 - t1 
    if print_at[i] 
    elapsed_per = (total_elapsed - last_elapsed)/(i - last_count) 
    puts "#{i}\t#{@reqs.stats['storageSize']}\t#{total_elapsed}\t#{elapsed_per}\t#{@reqs.count}" 
    last_count = i 
    last_elapsed = total_elapsed 
    end 
end 

這裏的結果:

inserts size t_elapsed t_per_insert 
1 13568 0.000333 0.000333 1 
1000 284928 0.440234999999999 0.000440342342342342 1000 
5000 4626688 2.399554 0.000489829750000001 5000 
10000 4626688 4.04515699999996 0.00032912059999999 10000 
50000 18520320 18.3045380000001 0.000356484525000004 50000 
100000 35192576 36.1132420000052 0.000356174080000102 100000 
250000 79207168 89.8520730000556 0.000358258873333669 250000 
500000 142587904 179.141312000645 0.000357156956002356 500000 
750000 184073216 262.518961001337 0.00033351059600277 750000 
1000000 233855488 347.697380001333 0.000340713675999983 1000000 
2000000 554531072 722.684815985293 0.00037498743598396 2000000 
3000000 827051520 1122.17787597268 0.000399493059987388 3000000 
4000000 1005428224 1468.68356799303 0.000346505692020353 4000000 
5000000 1219480064.0 1803.55257001283 0.000334869002019792 5000000 
6000000 1476342016.0 2152.29274403266 0.000348740174019833 6000000 
7000000 1784576256.0 2497.58802604997 0.000345295282017315 7000000 
8000000 1784576256.0 2877.84758905944 0.000380259563009462 7692111 

您可以在最後一行,這樣做後,8000000節省看到,該數據庫只有7692111項。

這裏是一個小的環境信息:

$ ruby --version 
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux] 
$ uname -a 
Linux shiny 2.6.31-19-generiC#56-Ubuntu SMP Thu Jan 28 01:26:53 UTC 2010 i686 GNU/Linux 
$ mongod --version 
db version v1.8.1, pdfile version 4.5 
Sun May 29 21:58:20 git version: a429cd4f535b2499cc4130b06ff7c26f41c00f04 

注意,我的硬盤還有22G運行此測試後免費的,所以我想這是沒有問題的。這裏是MongoDB文件:

$ ls -lh /var/lib/mongodb 
total 3.0G 
-rw------- 1 mongodb nogroup 16M 2011-05-29 17:24 benchmark.0 
-rw------- 1 mongodb nogroup 32M 2011-05-29 16:38 benchmark.1 
-rw------- 1 mongodb nogroup 64M 2011-05-29 16:36 benchmark.2 
-rw------- 1 mongodb nogroup 128M 2011-05-29 16:39 benchmark.3 
-rw------- 1 mongodb nogroup 256M 2011-05-29 16:48 benchmark.4 
-rw------- 1 mongodb nogroup 512M 2011-05-29 16:58 benchmark.5 
-rw------- 1 mongodb nogroup 512M 2011-05-29 17:09 benchmark.6 
-rw------- 1 mongodb nogroup 512M 2011-05-29 17:17 benchmark.7 
-rw------- 1 mongodb nogroup 512M 2011-05-29 17:24 benchmark.8 
-rw------- 1 mongodb nogroup 512M 2011-05-29 17:16 benchmark.9 
-rw------- 1 mongodb nogroup 16M 2011-05-29 17:24 benchmark.ns 
-rwxr-xr-x 1 mongodb nogroup 6 2011-05-28 15:46 mongod.lock 
drwxr-xr-x 2 mongodb nogroup 4.0K 2011-05-29 16:34 _tmp 

我猜無論失敗的插入的具體原因,我特別想知道爲什麼沒有引發異常。我理解複製用戶可以在所有節點成功保存數據之前「成功」,但這不應該是我的筆記本電腦上運行的vanilla實例的問題,對吧?

回答

3

mongo中有32位限制。它只允許存儲2.5 GB的數據。那是最大尺寸。檢查此link欲知更多信息。

+0

嗯,有趣。起初,我認爲這不可能,因爲我在64位機器上,但事實證明,我的Ubuntu安裝是32位的。儘管如此,對於「巨大」的分貝來說,這是一個令人驚訝的選擇。謝謝你的幫助! – 2011-05-30 09:34:44

1

顯然不會引發錯誤是由設計,即使當您的數據庫只是一個服務器。這篇文章似乎是最翔實:

http://www.thebuzzmedia.com/mongodb-single-server-data-durability-guide/

我還是搞清楚我的選擇的細微之處,但他們在這一些變化:

@reqs.insert(req, :safe => true) 

有了新的代碼,我用此消息得到一個例外:

10084: can't map file memory - mongo requires 64 bit build for larger datasets (Mongo::OperationFailure) 

所以拉梅什是正確的!

我必須說我同意那些發現這是一個相當令人震驚的默認設置的人。我很高興我現在注意到它,而不是默默地放棄了一個月的分析數據。

+0

是的,默認情況下':safe => false',這就是爲什麼它默默地失敗。火和忘記。很多人錯過了這個重要的事實。 – oma 2011-05-30 10:58:30

相關問題