Thread overview
Satır/Sütun Yer Değiştirme
Aug 20, 2018
Salih Dinçer
Aug 20, 2018
kerdemdemir
Aug 20, 2018
Salih Dinçer
Aug 26, 2018
Salih Dinçer
Aug 27, 2018
kerdemdemir
August 20, 2018

Merhaba,

Kısaca eşit sonlanmayan (satır uzunlukları farklı olan) metin tabanlı bir veritabanı dosyasını X <-> Y yer değişimi yapmak istiyorum. Parantez içerisinde ifade ettiğim özelliği bir şekilde halledeceğim o yüzden belirsiz satır uzunluğunu kapsam dışı bırakalım. Ama bunlar çok büyük bir dosya oluşturuyor. Peki bunu D ile en hızlı nasıl yapabiliriz?

Misal:

/* Şu verileri:
 QWER
 TYUI
 ASDF
 GHJK
** şu şekilde çevirmeliyiz? **
 QTAG
 WYSH
 EUDJ
 RIFK
*/

iyi bayramlar..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 20, 2018

Selam Salih Hocam,

std.range.transposed işini görürmü acaba,

//DMD64 D Compiler 2.072.2

import std.stdio;
import std.range;

void main()
{
   string[] ikiboyutluDizi = ["QWER",
                                        "TYUI",
                                        "ASDF",
                                        "GHJK"];

   writeln(ikiboyutluDizi.transposed);
}

[QTAG, WYSH, EUDJ, RIFK] yazdırıyor.

Sen basitleştirmek için kısa yazmışsın ama acaba QWER.. diye yazdığın datanın türünü belirtebilirmisin?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 20, 2018

Selamlar,

Muhtemelen görmez çünkü verinin tamamını uygulamak imkansız, en azından çok vakit alır.

Aslında satır sayısı görece fazla değil. Yani talihsiz olan nokta bu, çünkü satır başı işareti ('\n') karşımıza çıkana dek onbinlerce karakter veri geliyor. Satır/sütun evirmeyi başarabilirsem herşey daha kolay olacak.

Acaba 'rawRead()' okuma indeksini istediğimiz yere alabiliyor muyuz? Çünkü, pekala satır başlarındaki ilk karakteri okutarak ilk satırı oluşturmak mümkün. İkinci ve diğer satırlar için ise yine aradaki verileri okuma vakti harcamadan atlatarak tekrarlanabilir.

Teşekkürler...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 26, 2018

Merhaba,

Hafta sonu gelişme kaydettim; meğerse std.file'ın 'tell()' ve 'seek()' metotları varmış da benim haberim yokmuş. Ehh haliyle işler çok kolay oldu ancak verileri 8 baytlar şeklinde işlemek dışında çok fazla bir iyileştirme yapamadım. :)

Her şeyi de belleğe almak istemiyorum, sizce daha akıllıca bir şey mümkün mü? Örneğin önce dosyanın satır başı karakterlerini 'strip()' ile şöyle tespit ettim:

   while (!aFile.eof()) {
     auto xSay = 8; //* TEST */ aFile.tell.writeln(": ", aFile.rawRead(new char[8]));
     string s;
     do {
       aFile.seek(lastSeek - xSay);
       aFile.rawRead(d.x);
       s = "";
       foreach(c;d.x) s ~= c;
       xSay += 8;
     } while(s.strip.length > 7);
     seekLog ~= lastSeek = aFile.tell();
     lastSeek += maxWidth;
     dBuff ~= SekizlikVeri(0);
     aFile.rawRead(dBuff[$-1].x);
    }
    seekLog.writeln;

Sonra geriye doğru haritasını çıkardığım dosyanın (-bknz. seekLog[]) satırlarını 8'er bayt okuyarak grup halinde x -> y dönüşümünü yaptım ki aslında kolaymış. Ama veri çok olunca HDD Cache'e güvenmekten başka çarem kalmadı!

    uint xSkip;
    dBuff.SekizliVeriYaz(xSkip);
    for(int y; y < maxWidth/8; y++) {
      xSkip += 8;
      for(int x; x < seekLog.length; x++){
        aFile.seek(seekLog[x] + xSkip);
        aFile.rawRead(dBuff[x].x);
      }
      dBuff.SekizliVeriYaz(xSkip);
    }
    aFile.close();

Elbette union olarak kurduğum SekizlikVeri'yi 16/32/64 yapmak da bir yöntem olabilirdi:

   union SekizlikVeri {
     ulong x64; // AltmışDörtBit
     char x[8]; // SekizBayt

     void ilkle () {
       foreach(ref set; x) {
         set = '0'; //* swBlock
       }            /*/////////
         "\t".write(&set);
       } "\n".writeln(x64);//*/
     }
   }

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 27, 2018

Merhaba,

Ben aralik operasyonlarinin bu opearasyonlari kullanmayan kodlalarla performans farkini merak ettigim icin kodu anlamaya calisdim. Istedigim rawRead, seek. for , while gibi fonksiyon ve anahtar kelimeler yerine eger mumkunse std fonksiyonlari kullanip performansi kontrol etmekti.

Ilk mesajda soyledigin transpose operasyonu aradim, ben goremedim. Belki transpose operasyonuna odaklandigim ve bulamadigim icin ne yaptigini anlayamadim.

Anlayamadigim noktalardan bazilari kodun bir kisminin olmamasindan olsa gerek :
lastSeetk-> bu hangi degerle hayata getiriliyor niye hep +=maxWidth ile artiriliyor. Ya satir daha kisa ise
birden fazla satir var demistin, satirlari nerde ayirdin.
transpose ettigin sey her zaman 8 byte mi acaba datanin turunu belirtebilirmisin.

Bunun disinda bellege parca parca alma gibi bir durum oldugunu yazmissin. Daha once belirtmemistin. Bunun gibi baska kisitlamalar varsa yazabilirmisin.

Guvenmekden baska yapabilcegin sey olcmek olabilir diye dusunuyorum. Bilgili olmadigim bir konu ama sunlari okuduktan sonra https://stackoverflow.com/questions/21200264/is-using-istreamseekg-too-much-expensive
https://stackoverflow.com/questions/2438953/how-is-fseek-implemented-in-the-filesystem rawRead,seek fonksiyonlarinin dongu icinde cagrilmasinin iyi performans sergilecegini dusunmuyorum.

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]