Merhaba arkadaşlar,
Bugün sizlerle acayip, acayip olduğu kadar da zor bir konuyu paylaşacağum. Son bir haftadır çalıştığım firmada ‘Şişirme Veri Girişi’ (Bulk Data Creation) ile uğraşmaktayım. Uzun bir süre değil mi ? evet uzun :) ama yapacak birşey yok uzun sürüyor işte :)
Aklınızda hemen, bu konu neden Önemli, üzerinde neden çalışıyoruz şeklinde sorular oluşabilir, oluşmalıdır da :) bu nedenle sizlere Öncelikle müşterilerin şişirme veri girişini neden istediklerini izah etmeye çalışayım;
– İlk Örneğimiz Microsoft’un Windows işletim sisteminden; işletim sistemine çok fazla program ekleyip kaldırdığımızda sistemin yavaşladığını Registery dosyasının şişmesine bağlarız. Zamanında Microsoft’da çalışan arkadaşlar, bu durumu test etmemiş veya test etmiş fakat sonuçlarını dikkate almamışlar ki biz halen ‘Windows’u nasıl hızlı kurarım’ gibi işlerle uğraşıyoruz.
– 3~5 yıldır kullanılan yazılımlarınızda, çok uyduruk işlemlerin bile artık çok fazla zaman aldığına şahit olabilirsiniz. Bunun nedeni başlangıç verinin çok küçük olacağını düşünüp, veri tabanında uygun indeksleri kullanmamız veya yazdığımız algoritmaların p = n^2 (buradaki ‘n’ veri adedi, ‘p’ performans) veya buna benzer bir şekilde çalışması olabilir. Örnek vermek gerekir ise; n = 1 ise, p = 1, n = 2 ise p = 4, n = 3 ise p = 9, n = 4 ise p = 16 olur… bu durumda 3~5 sene sonra n = 100 olduğunda p = 10.000 olur ki… sistem artık çalışmıyor demektir. Elbetteki Örnekler daha da arttırılabilir.
Akıllı yazılım müşterilerinin artık bu soruyu sormaya başlamalarının nedeni işte bunun gibi nedenler arkadaşlar. Peki biz yazılımcılar bu durumda neler yapabiliriz. Aklınıza ‘Veri boyutu 2 katına çıkarsa sistemin bunu işleme süresi de 2 katına çıkar.’ gibi bir yaklaşım gelebilir. Bu yanlıştır, bu şekilde olmamalıdır. Günümüzdeki veri tabanı uygulamalarını akılcı kullanmak ve eğer bu da yetmiyor ise, yazılıma arvişleme yeteneği eklemek gerekir.
Veri tabanı performansı günümüzde çok büyük problemler teşkil etmemektedir. Asıl problem, programın yazıldığı algoritmanın ve yapılan dizaynın getirdiği kısıtlamalardır. İşte bu tür kısıtlamaları ve bunlara bağlı performans düşüşlerini daha rahat yakalamak için uzun vadeli çalışacak olan sistemlerde şişirme veri girişi(bulk data creation) işlemi ile beraber performans sınaması gerçekleştirilmelidir.
Evet tanımı yaptıktan sonra aklınızda oluşan bazı karışıklıkları gidermek gerekir. Öncelikle Örnek Veri Girişi ile Şişirme Veri Girişi arasındaki farkı sizlere tarif etmem gerekiyor. Örnek veri girişi; sistemin olanaklarını çok zorlamayacak şekilde, Örnek teşkil edecek çoklukta veri girmektir. En fazla sistemde oluşabilecek bir aylık verinin oluşturulmasıdır. Şişirme Veri Girişi ise; Sistemde stres test yapmak ve data boyutlarının hangi sevilere doğru çıktığını, en kÖtü koşullarda veri tabanı üzerinde yapılacak işlemlerin veya yazılmış algoritmaların ne kadar süreceklerini gÖrebilmek için yapılan işlemdir. Tahmini 2 veya 3 seneden daha az olmamak kaydı ile veri giriş yapılmalıdır. Diğer bir deyişle Örnek Veri Girişinin 30 veya 40 katı kadar veri girilmesi gerekir. Girilen bilgiler en az Örnek veri girişinde olduğu kadar mantıklı ve kendi içerisinde tutarlı olmalıdır.
Bu aşamadan sonra sizlere nasıl hızlı ve mantıklı şişirme veya Örnek veri girişi nasıl yaparsınız onları tarif etmeye çalışacağım. Bu işlem için elbetteki Ruby’yi :) kullanacağız(.NET veya Java’yı da kullanabilirdik ama henüz onlarda bu işlemler kolaylaşmadı.).
Bu işlemi Microsoft SQL Server için gerçekleştireceğiz. BÖylece Microsoft SQL Server için ActiveRecord bağlantısını da incele fırsatı bulmuş oluruz. Öncelikle sizlere neden ActiveRecord kullandığımızı açıklamam gerekir, daha Önceki ODBC yazılarımda (1,2,3,4) belirtiğim kütüphane ile değilde, neden ActiveRecord ile gerçekleştiriyoruz. Çünkü ODBC düşük seviyeli bir bağlantı prokolüdür. Fakat ActiveRecord yüksek seviyeli bir veri tabanı ile Ruby arasında bir eşleme kütüphanesidir. Yani ActiveRecord’da veri tabanında bulunan tablolardan Ruby sınıfları oluşturulabilir, bu sınıflar üzerinde ‘Insert’, ‘Delete’, ‘Update’ ve ‘Select’ gibi SQL işlemleri birkaç küçük hareket ile gerçekleştirilebiliriz. Fakat ODBC bize bu şekilde bir yardımda bulunmaz, aynı işlemleri ODBC kullanarak bizlerde gerçekleştirebiliriz, ama bunun için kod yazmamız gerekir ki :) tembel adamın istiyeceği en son şeydir :). Hazırı var işte ActiveRecord :). Eğer ActiveRecord üzerinde hoşumuza gitmeyen bÖlümler olursa Ruby’nin esnekliğinden faydalanarak bunları değiştirebiliriz. Ayrıca ActiveRecord, ODBC gibi bir bağlantı kütüphanesi değildir, tek başına herhangi bir veri tabanına bağlanamaz fakat ODBC, ADO, DBI, OCI gibi birçok bağlantı kütüphanesini kullanabilir.
Neden ActiveRecord kullandığımızı da açıkladığımıza gÖre şimdi sırada ‘Microsoft SQL Server üzerinde ActiveRecord’u nasıl kullanılırız ?’ sorusunu çÖzelim. Öncelikle ActiveRecord Ms SQL Server’a 2 şekilde erişebilir. Bunlardan birisi ODBC, diğeri ADO üzerinden. ODBC ile bağlantıda (bu yazıyı yazdığım sırada) birtakım problemler vardı, problemi çÖzmek yerine ADO ile bağlantı kurmak daha kolaydı, bende ADO ile bağlantı yÖntemini seçtim :).
Şimdi adımlarımız şu şekilde olacak; Bu diğer ruby kurulumlarına gÖre biraz daha uzun.. 3 adımdan oluşuyor :)
– ‘One Click Installer’ ile windows sisteme Ruby’yi güzel güzel kuruyoruz.
– ‘gem install ActiveRecord –include-dependencies‘ komutu ile ActiveRecord kurulumu gerçekleştirilir.
– Daha sonra Ruby DBI kütüphanesinin son versiyonu indilir.
– İndirilen Ruby DBI kütüphanesi içerisinde yer alan ‘ado.rb‘ dosyası, ‘ruby/lib/ruby/site_ruby/1.8/DBD/‘ içerisinde ‘ADO‘ isimli bir klasÖr açılarak içerisine kopyalanır.
ta..taa.. işte ActiveRecord kütüphanesi ADO bağlantısı ile Microsoft SQL Server veya Ms Access’e bağlanabilir durumdadır.
Bu aşamadan sonra bizim için ActiveRecord’u kendimize gÖre uyarlamak kalıyor; ActiveRecord veri tabanı isimlendirme, tarih alanlarının güncellenmesi.. vb.. bir takım konularda bazı varsayımlar yapmaktadır, bunları kendimize gÖre düzenlemeli yola bu şekilde devam etmeliyiz, bu değişikleri tamamıyla sizlere bağlı o nedenle ben bu konulara pek girmeyeceğim. Aslında amacım ActiveRecord’du da anlatmak değildi, bu nedenle hemen küçük bir Örnek ile işlemi bitireceğim.
# Hemen bağlantımızı kuralım :) ActiveRecord::Base.establish_connection( :adapter => "sqlserver", :mode => "ADO", :host => "Makina_adi", :database => "veri_tabani", :username => "kullanici", :password => "sifresi" ) # Order adlı bir sınıfımız olduğunu sÖyleyelim. class Order < ActiveRecord::Base # tablo adı varsayılan olarak Orders'dır. Fakat siz orders değil, tablo_adi'dir dediniz. set_table_name "dbo.[tablo_adi]" # Primary_key varsayılan olarak 'id' dir. Bunu Id'ye çeviriyoruz. set_primary_key 'Id' # Ayrıca ActiveRecord, Primary_key'in Auto_increment olduğunu var sayar bu nedenle # herhangi set işlemine izin vermez, biz bunu da ezmek istersek... def Id=(value) self.id = value end # veya attr_writer :Id # Aynı zamanda, ben hiç validate, after_validate.. gibi methodlar kullanmayacağım diyorsanız. # Aşağıda belirtilen şekilde kısa yoldan Create işlemide yapabilirsiniz. public :create_without_callbacks end # Çoğaltmak istediğim Order bulunur. order = Order.find(15) new_order = order.clone # new_order'a order'ın aynısı yaratılır. new_order.Id = 16 # new_order'ın Id'si 16 yapılır. new_order.Name = order.Name + "Bulk" new_order.Date = Time.now # ile validate işlemleri çağrılmadan kayıt veri tabanında yaratılır new_order.create_without_callbacks
Şimdi istediğiniz kadar büyük dÖngü ile çok kolay ve hızlı bir biçimde kayıt gerebilirsiniz :)
Kolay gelsin :)
1 Response
[…] etkeni daha da önemli hale geliyor. Yanlış anlaşılma olmasın, burada bahsettiÄŸim performans ÅžiÅŸirme Veri GiriÅŸi adlı yazıda bahsettiÄŸim veri yoÄŸunluÄŸunun artması ile beraber ortaya çıkan performans […]