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. ]