Ruby ile KyotoCabinet – 2

Merhabalar,

Bir Önceki yazımıza kaldığımız yerden devam ediyoruz. Bu sefer Kyoto Cabinet’in insert (kayıt ekleme) performansını inceleyeceğiz.

Öncelikle bu bir performans çalışması olduğu için makinamın Özelliklerini verelim;
– 2 x AMD Athlon x64 3800+
– 2 G Ram
– Ubuntu 10.04 LTS
– FileSystem ext4
– Ruby 1.8.7 (2010-01-10 patchlevel 249)
– KyotoCabinet 1.2.2
– KyotoCabinet ruby kütüphanesi 1.14

En azından bu Özelliklerle yapılan bir test sizleri kodu kendi makinanıza alıp denemeniz için cezbedebilir. Sonuçta bir Önceki yazıdan kurulum işlemleri uygulayıp sonrasında aşağıda belirteceğim kod parçasını uygulayacaksınız. Sonuçları benimle paylaşabilirsiniz.

require 'kyotocabinet'
include KyotoCabinet

DB::process('subscribers.kch') { |db|
  # resmi sitede yer alan Örneklerde set_encoding olarak gÖsteriliyor fakat aslında tune_encoding olmalı.
  db.tune_encoding('utf-8')

  # Telco sektÖründe çalıştığımız için, numara bir MSISDN'e benziyor degil mi :)
  start_number = 905000000000

  start_time = Time.now
  puts "sira;gecen_sure;toplam_gecen_sure"
  100.times { |index|
    first_loop_start_time = Time.now
    10000.times {
      start_number += 1

      # Evet alt satirda KyotoCabinet üzerinde "Insert" islemi yapıyoruz.
      db[start_number] = start_number
    }
    loop_elapsed = Time.now.to_f - first_loop_start_time.to_f
    total_elapsed = Time.now.to_f - start_time.to_f
    puts index.to_s + ";" + loop_elapsed.to_s + ";" + total_elapsed.to_s
  }

  puts "1.000.000 kayit eklenmistir. Toplam süre: " + (Time.now.to_f - start_time.to_f).to_s
}

ruby kyoto_test01.rb > output.csv ile çalıştırırsanız çıktı dosyasını bir office programında açar ve performans analizinizi daha hızlı yapabilirsiniz. Unutmadan uygulamayı Netbeans veya Scite gibi editÖrlerin üzerinden çalıştırmayın toplamda benim makinamda 3 sn gibi fazlalıklara neden oldular.

İşte benim makinam üzerindeki sonuçların bir Özeti;

sira;gecen_sure;toplam_gecen_sure
0;0.0716860294342041;0.0717239379882812
1;0.0688560009002686;0.140642881393433
2;0.0690369606018066;0.209718942642212
3;0.068897008895874;0.278653860092163
10;0.069115161895752;0.761880874633789
11;0.0690290927886963;0.830944061279297
12;0.0703730583190918;0.901350975036621
20;0.0692358016967773;1.45950984954834
21;0.0701730251312256;1.52971887588501
40;0.070019006729126;2.86578583717346
41;0.0729498863220215;2.93877291679382
42;0.070343017578125;3.00915694236755
51;0.0712201595306396;3.64983987808228
52;0.0714530944824219;3.72132802009583
70;0.0727591514587402;5.02351403236389
71;0.0728018283843994;5.09635186195374
72;0.072667121887207;5.16905283927917
73;0.0726268291473389;5.24171686172485
91;0.0735421180725098;6.5553150177002
99;0.073847770690918;7.14546489715576
1.000.000 kayit eklenmistir. Toplam süre: 7.14549398422241

GÖrüldüğü üzere ilk 10.000’lik kayıt 2. ve 3. 10.000’lik kayıtlardan uzun sürede gerçekleştirmiş. Bu ayağa kalkmak için biraz süre harcadığını gÖsteriyor fakat oran gerçekten çok çok az, rahatlıkla tolare edilebilir. Fakat insert işlemi devam ederken sonlara doğru işlem zamanının yavaş yavaş uzadığını gÖrebilirsiniz. Bunun nedeni KyotoCabinet olacağı gibi Ruby’de olabilir, kesin bir sonuç için biraz daha araştırma yapmak lazım.

Aşağıdaki 2 satır incelendiğinde değişimin ~0,04 sn çevresinde olduğunu sÖyleyebiliriz. Bu farkın 2000. kayıt ile 910.000 kayıt arasında olduğunu da belirtmekte fayda var.
2;0.0690369606018066;0.209718942642212
91;0.0735421180725098;6.5553150177002

Ek olarak KyotoCabinet’e herhangi bir Insert işlemi olmadan (db[start_number] = start_number olmadan) çalıştırdığımda; Ruby’nin toplamda ~1.5 sn.i kendisine ayırdığını gÖrdüm. İşte size 99. 10.000’lik işlem kayıdı;
99;0.014927864074707;1.51742100715637
Bu satır bize 0.073’lük harcama için 0.015’lik bÖlümünün Ruby taradından alındığını gÖsteriyor. Aslında Kyoto Cabinet üzerinde harcanan süre 10.000’lik ekleme için ~0.058 olmalı.. yani Öyle gÖrünüyor.

Sonuç olarak oldukça güçlü kayıt ekleme algoritmasına sahip olan bir veri tabanından bahsediyoruz. Açıkçası bu kadar hızlı olacağını beklemiyordum.

İyi çalışmalar.

Share