Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
36
Cevap
5454
Tıklama
0
Öne Çıkarma
C# ile yazdığım küçük programa Müdürüm çok yavaş çalışıyor dedi
T
11 yıl
Çavuş
Konu Sahibi

İş yerinde benden rutin bir hesabı çok fazla kere tekrarlayan bir .exe dosyası üretmem istendi.
Algoritma planım oldukça basit:
1.dosya.txt den datayı satır satır al, her satır için rutin hesap işlemlerini gerçekleştir, çıktıyı 2.dosya.txt'ye yazdır.

Büyük bir heyecanla yaptığım exe'yi müdüre gönderdim.
Müdür ise 100 milyon satırlık (her bir satır ondalıklı kısımlar dahil 8 haneden oluşan boşlukla ayrılmış 6 sutun içeriyor) txt dosyasını çok yavaş işlediğini söyleyerek tepki gösterdi. Olmamış bu dedi :)
Biraz bozuldum ama pes etmek istemiyorum. Durumu telafi etmek adına uzun süredir internette çözüm arıyorum. Müdürün iddiası 100 milyon satırın hesabını 5-6 dk içinde yapan bir .exe yazmış geçmişte.
Ancak bu .exe dosyası 64 bit makinalarda çalışmayan ve basic diliylemi ne yazmış. Güncel yazılım dillerini öğrenecek yaşı geçtiğini düşündüğünden bu ulvi görevi bana verdi ama ben de onu hayal kırıklığına uğrattım.
C# bilgim amatör seviyededir. Ama bugüne kadarki yazdığım programcıklar beni hiç yarı yolda bırakmadı.

Merak ettiğim şunlar:
1-) C# console ile C# windows aplication arasında hız açısından fark olur mu?
2-) Gerçekten her biri 8 karakter içeren 6 sutundan oluşan 100 milyon satır bir .txt dosyasından alınıp başka bir .txt dosyasına 5-6 dk. da yazdırmak mümkün müdür? (müdür müdür müdür )
3-)Bir for döngüsü ile 100 milyona kadar artan i değerini bile bir .txt dosyasına yazdırmak 1 saati geçiyor. Bu normal midir?

Algoritmamın basitleşmiş hali şu şekildedir:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
string[] metin;
decimal hn;
decimal sn;
string writeThisis;
string yazi;
StreamReader oku;
//-----------------------------------------------------------------------------
oku = File.OpenText("dosya1.txt");
while ((yazi = oku.ReadLine()) != null)
{
metin = Paket(yazi).Split(';');
hn = Convert.ToDecimal(metin[1]) + Convert.ToDecimal(metin[2]);
sn = Convert.ToDecimal(metin[3]) + Convert.ToDecimal(metin[4]);
writeThisis = "" + (hn * sn);
yazici(writeThisis);
}
}
public void yazici(string yzT)
{
StreamWriter SW = File.AppendText("dosya2.txt");
SW.WriteLine(yzT);
SW.Close();
}
private static string Paket(string dizi)
{
string eko = "";
string yz = edit(dizi.ToString());
string[] Paket = yz.Split();
for (int i = 0; i < Paket.Length; i++)
{
if (Paket[i] != "")
{
eko += Paket[i] + ";";
}
}
return eko;
}
private static string edit(string datam)
{
string oks;
oks = datam.ToString();

return oks;
}
}
}


Yardımlarınızı, eleştirilerinizi, tavsiyelerinizi ve önerilerinizi bekliyorum.





< Bu mesaj bu kişi tarafından değiştirildi tatari81 -- 14 Mart 2014; 14:26:31 >

G
11 yıl
Yarbay

Yazdığın koda pek dikkat etmemiştim ama 10kb/sn deyince bakma ihtiyacı hissettim. :) C# bilmediğim için detaylı bilgi veremem ama kodda ciddi hatalar gördüm.

1- Dosya okuyup yazan nesnelerin buffer boyunu alan kurucu metodları varmış. Bunları kullan ve buffer ı 64 * 1024 yap.http://msdn.microsoft.com/en-us/library/vstudio/72d9f8d5(v=vs.110).aspx
2- decimal türü 128 bitmiş, oldukça yavaş çalışır. float ya da double kullan.
3- Ölümcül bir hata yapmışsın, yavaşlığın ana kaynağı bu. "yazici" metodun her satırı yazarken yeni nesne kuruyor ve sonra da dosyayı kapatıyor. Dosya kapatılırken bütün buffer dosyaya yazılır (flush) sonra kapatılır. Diğer bir deyişle buffer hiç dolmaz, yani etkisiz hale gelir. Ekstra cpu kullanımı da cabası. Yapman gereken şey streamreader ve streamwriter nesneleri ya sınıfın bir üyesi olacak, ya da static olacak (bu daha iyi). Bu durumda yazici metodun sadece tek satırdan ibaret olur. "yaz.WriteLine(blabla);"

Dosya komple yazıldıktan sonra Close ile kapatırsın ve nesneleri null larsın ki çöp toplayıcı işini yapsın.


Bu mesaja 2 cevap geldi.
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.