19 Aralık 2007

GİRİŞ
Burada list yapılarının kullanımını ve dosya işlemlerinin anlatımı için gerçekleştirdiğim projenin detaylarını ve örnek kodlarını veriyorum.Consol ekrandan parametreler giriliyor ve RAM bellek kullanımıda göz önünde bulundurularak 760 Mb bir text dosyası üzerinde sıralama işlemi yapacağız:)
KAYITLARIN SIRALANMASI VE PROJE DETAYI:
Her satırında bir kayıt olmak üzere, 8 050 290 (yaklaşık sekiz milyon) adet kayıt içerenen “kddcup.data.gz veya daha küçüğü kddcup.data_10_percent_unlabeled.gz” isimli metin dosyasını belirtilen bir alanına göre sıralayan bir program yazacağım.

Yazacağım program genel amaçlı, herhangi bir alana göre sıralama yapabilen bir program olmakla birlikte, programımızın sınamasını yukarıda verdiğim metin dosyasını girdi olarak vererek yapacağım. Programımız (dosya_sırala.exe) komut satırından aşağıdaki parametrelerle çalışacaktır:

Dosya_sırala.exe || input_text_file || output_text_file || tab_or_comma_separated || sort_field_number


Buradaki parametrelerin açıklaması aşağıdaki gibidir:

input_text_file
: gridi metin dosyasının her bir satırında, alan değerleri virgül yada tab karakterlerle ayrılmış kayıt bilgileri bulunur. Dikkat ediniz ki bu bir metin dosyasıdır, sabit kayıt uzunluklu bir binary kayıt dosyası değildir.

output_text_file :
Çıktı metin dosyası , girdi dosyasıyla aynı biçimdedir ve aynı içeriklidir ancak içindeki kayıtlar ’ıncı alan değerlerine göre küçükten büyüğe sıralıdır. Bir başka deyişle çıktı dosyası girdi dosyasının sıralanmış halidir. Çıktı dosya metin dosyası yerine kayıt dosyası da olabilir.

tab_or_comma_separated :
girdi metin dosyasının içindeki alan değerlerinin hangi karakterle ayrılmış olduğunu belirtir. “tab” veya “comma”.

sort_field_number :
Sıralamanın hangi alana göre yapılacağı bu parametre ile belirtilir. Alanın girdi dosyası içerisindeki sıra numarasıdır. Örneğin bu parametre 5 ise, bu 5. alana göre sıralama yapılacağını belirtir. Bu örnek için program 4. ile 5. ayıraç karakteri arasındaki değere göre kayıtları sıralayacaktır .



Sınama girdi dosyası “kddcup.data.corrected” ile ilgili daha detaylı bilgiyi ve daha küçük bir kısmını “Network Intrusion Detection” için kullanılan verileri barındıran KDDCUP99 sayfasından edinebilirsiniz. Girdi dosyasının alanları ile ilgili bilgi kddcup.names dosyasındadır. Girdi dosyasının bir satırının uzunluğu 256 karaktere kadar olabilir. Projemizin çalışmasını şu parametrelerle çalıştırıp gösterdim:

Dosya_sırala.exe kddcup.data.corrected kddcup.data.corrected.sorted.txt comma 6

Bu çalıştırma, alanları virgülle ayrılmış dosyayı altıncı yani dst_bytes alanına göre sıralayacaktır.

Programımız ve algoritmamız tasarlarken şu hususlara özellikle dikkat edildi: Programımız 256MB RAMli makinalarda çalışacak şekilde hazırladım, programımızın tüm kayıtları hafızaya sığdırması mümkün olmayacağından, mevcut hafıza ile makul bir sürede sonlanmasını sağlayacak bir yöntem uyguladım.
PROJENİN C# PROGRMALAMA DİLLERİNDEKİ CONSOL UYGULAMA KODU:

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

namespace odevcons
{
public class Parcalama
{

public string str1;

public int siralanacak;

public string str2;

public Parcalama(string str1, int siralanacak, string str2)
{
this.str1 = str1;
this.siralanacak = siralanacak;
this.str2 = str2;

}

}

class Program
{
static void Main(string[] args)
{

/* try
{
byte[] buffer = new byte[268435456];
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
*/
string girdi = args[0];
string cikti = args[1];
string bosluk = args[2];
int kolonno =Int32.Parse(args[3]);



dosyaoku(girdi,cikti,bosluk,kolonno-1);


}
static void dosyaoku(string dosyaIsmi, string ciktidosyasi,string boslukadi,int kolon)
{
// Text dosyasından okuyan StreamReader sınıfına ait bir
// dosyaOku nesnesini oluşturuyoruz
//StreamReader dosyaOku;
// dosyadan okuyacağımız yazıyı string olarak depolamak için
// yazı nesnemizi oluşturuyoruz.
//string yazi;

List parcalar = new List();

//Dosyamızı okumak için açıyoruz..
// dosyaOku = File.OpenText(dosyaIsmi);

//Dosyamızı okumak için açıyoruz ve ilk satırını okuyoruz..
//yazi = dosyaOku.ReadLine();

/* okuduğumuz satırı ekrana bastırıp bir sonraki satıra geçiyoruz
* Eğer sonraki satırda da yazı varsa onu da okuyup ekrana bastırıyoruz.
* Bu işlemleri dosyanın sonuna kadar devam ettiriyoruz.. */
//int oku = 0;
for (int sayac = 0; sayac < 120000000; sayac = sayac + 10000) { FileStream fs = new FileStream(dosyaIsmi, FileMode.Open, FileAccess.Read); //fs.Position = ps; StreamReader dosyaOku = new StreamReader(fs); fs.Seek(sayac, SeekOrigin.Begin); byte[] kaynak = new byte[10000]; //long yer; fs.Read(kaynak, 0, 10000); string komple = System.Text.Encoding.GetEncoding(1254).GetString(kaynak).ToString(); string[] satirline = komple.Split('\n'); for (int cev = 1; cev < satirline.Length - 1; cev++) { //while (yazi != null) //{ string[] dizi; string str1 = ""; string str2 = ""; string yazar = satirline[cev]; if (boslukadi == "comma") { dizi = yazar.Split(','); //sıralanacak kolonun solunu bir string parça olarak alıyorum for (int i = 0; i < kolon; i++) { str1 = str1 + dizi[i] + ","; } //sıralanacak kolonun sagını bir string parça olarak alıyorum for (int j = kolon + 1; j < dizi.Length; j++) { str2 = str2 + "," + dizi[j]; } Console.WriteLine("Yükleniyor..."); parcalar.Add(new Parcalama(str1, Int32.Parse(dizi[kolon]), str2)); } else if (boslukadi == "tab") { dizi = yazar.Split('\t'); //sıralanacak kolonun solunu bir string parça olarak alıyorum for (int i = 0; i < kolon; i++) { str1 = str1 + dizi[i] + "\t"; } //sıralanacak kolonun sagını bir string parça olarak alıyorum for (int j = kolon + 1; j < dizi.Length; j++) { str2 = str2 + "\t" + dizi[j]; } Console.WriteLine("Yükleniyor..."); parcalar.Add(new Parcalama(str1, Int32.Parse(dizi[kolon]), str2)); } //yazi = dosyaOku.ReadLine(); } // dosyamızı kapatıyoruz.. fs.Close(); } parcalar.Sort(delegate(Parcalama p1, Parcalama p2) { return p1.siralanacak.CompareTo(p2.siralanacak); } ); //Console.WriteLine(String.Format("{0} {1} {2}", p.str1, p.siralanacak, p.str2)); parcalar.ForEach(delegate(Parcalama p) { string satir = String.Format("{0} {1} {2}", p.str1, p.siralanacak, p.str2); Console.WriteLine("Sıralıyor..."); dosyayaekle(ciktidosyasi, satir); } ); Console.WriteLine("işlem başarılı"); Console.ReadLine(); } static void dosyayaekle(string dosyaismi,string satir) { StreamWriter dosya; //streamwriter sınıfından dosya isimli bir nesne üretiyoruz dosya = File.AppendText(dosyaismi); //dosya sonuna satır eklemek için file.appendtext kullandık dosya.WriteLine(satir); //satiri dosyaya yazdırıyoruz. dosya.Close(); } /* public static void parcalalisteekle(string yazi) { string[] dizi; string str1=""; string str2 = ""; string yazar = yazi; List parcalar = new List();
dizi = yazar.Split(',');

for (int i = 0; i <4; i++)
{
str1 = str1 + dizi[i]+",";
}
for (int j = 5; j < dizi.Length; j++)
{
str2 = str2 + dizi[j]+",";
}

parcalar.Add(new Parcalama(str1,dizi[4],str2));

parcalar.Sort(delegate(Parcalama p1, Parcalama p2)
{ return p1.siralanacak.CompareTo(p2.siralanacak); });

parcalar.ForEach(delegate(Parcalama p)
{ Console.WriteLine(String.Format("{0} {1} {2}", p.str1, p.siralanacak, p.str2)); });


}
*/
public static void parcala(int kolondeger)
{
int i = 0;
int[] dizi=new int[100];
dizi[i] = kolondeger;
i++;

}
}
}

1 yorum:

  1. merhablar... iyi bir çalışma gerçekten..

    YanıtlaSil

Her türlü eleştiri,yorum,ekleme ve düzeltmeye yönelik fikirlerinizi paylaşabilirsiniz.Hakaret içeren yorumlar filtrelenmektedir.

Makalelerin kötüye kullanım kullanıcının sorumluluğundadır. | networkpentest.net. Blogger tarafından desteklenmektedir.