ÅžiÅŸirme Veri GiriÅŸi / Bulk Data Creation

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 :)

ÅžiÅŸirme Veri GiriÅŸi / Bulk Data Creation” üzerine bir yorum

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir