Forum: D Programlama Dili RSS
dosyadan okuma dosyaya yazma ile ilgili bir soru/sorun
Sayfa:  önceki  1  2  3  4 
cos00kun #46
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 13426
Soru soracak birşey bırakmamışsınız Ali Hocam..
Şimdi biraz mola.. Bunları bir özümseyip birkaç güne Gtkd ile uyumunu geliştireyim bakalım..
E=mc^2
cos00kun #47
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Birşey sormayacağım dedim ama yine rahat duramadım kısa bi vaktinizi daha alacağım;
sanki şu kodları yazmasakta 3956 kere yazdırıyor geldi bana
    foreach (entity; entities) {
        writefln("%s", entity);
    }
foreach içine bir statik değişken sayaç koyduğumda 3956 kere bunu döndürdüğünü görüyorum ama sayacı yapıların oraya dayerleştirdiğimde de bu sefer ordaki sayaçta 7912 kere çalışıyor  :rolleyes:  yani 7912  yapnın içinde 3956 da foreach içinde.. Belki okurken sorun yok ama acaba yazdırıkenmi var yoksa yine saçma sapan bir yerde birşeymi atlıyorum :nuts:
E=mc^2
acehreli (Moderatör) #48
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4643 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bütün elemanlar burada 'entities' olarak yazdırılıyorlar:
    writefln("Elimde %s adet nesne var: %s", entities.length, entities);
Bir kere de burada:
    foreach (entity; entities) {
        writefln("%s", entity);
    }
Çabucak yazdığımız kodlarda böyle gariplikler olabiliyor. :/

Ali
cos00kun #49
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ne diyorsunuz Ali hocam şaka mı yapıyorsunuz  :blush: zaten benle uğraşmak bile hata yapılmaya müsait bir zemin hazırlar  :-D
şimdilik kod böyle oldu;
import std.stdio;
import std.format;
import std.exception;
 
// Bkz: https://pmc.editing.wiki/doku.php?id=falcon4:file_formats:ct_file
 
align(1)
struct VuEntity {
    align(1):
    ushort id;
    ushort collisionType;
    float collisionRadius;
    ubyte[8] classInfo;
    uint updateRate;
    uint updateTolerance;
    float fineUpdateRange;
    float fineUpdateForceRange;
    float fineUpdateMultiplier;
    uint damageSeed;
    int hitpoints;
    ushort majorRevisionNumber;
    ushort minorRevisionNumber;
    ushort createPriority;
    ubyte managementDomain;
    ubyte transferable;
    ubyte private_;
    ubyte tangible;
    ubyte collidable;
    ubyte global;
    ubyte persistent;
    ubyte[3] padding;
 
    void toString(void delegate(const(char)[]) sink) const {
        formattedWrite(sink, "id             : %s\n", id);
        formattedWrite(sink, "collisionType  : %s\n", collisionType);
        formattedWrite(sink, "collisionRadius: %s\n", collisionRadius);
        formattedWrite(sink, "classInfo[0]   : %s\n", classInfo[0]);
        formattedWrite(sink, "classInfo[1]   : %s\n", classInfo[1]);
        formattedWrite(sink, "classInfo[2]   : %s\n", classInfo[2]);
        formattedWrite(sink, "classInfo[3]   : %s\n", classInfo[3]);
        formattedWrite(sink, "classInfo[4]   : %s\n", classInfo[4]);
        formattedWrite(sink, "classInfo[5]   : %s\n", classInfo[5]);
        formattedWrite(sink, "classInfo[6]   : %s\n", classInfo[6]);
        formattedWrite(sink, "classInfo[7]   : %s\n", classInfo[7]);
        formattedWrite(sink, "updateRate     : %s\n", updateRate);
        formattedWrite(sink, "updateTolerance: %s\n", updateTolerance);
        formattedWrite(sink, "fineUpdateRange: %s\n", fineUpdateRange);
        formattedWrite(sink, "fineUpdateForceRange  : %s\n", fineUpdateForceRange);
        formattedWrite(sink, "fineUpdateMultiplier  : %s\n", fineUpdateMultiplier);
        formattedWrite(sink, "damageSeed     : %s\n", damageSeed);
        formattedWrite(sink, "hitpoints      : %s\n", hitpoints);
        formattedWrite(sink, "revision       : %s.%s\n", majorRevisionNumber, minorRevisionNumber);
        formattedWrite(sink, "createPriority : %s\n", createPriority);
        formattedWrite(sink, "managementDomain  : %s\n", managementDomain);
        formattedWrite(sink, "transferable   : %s\n", transferable);
        formattedWrite(sink, "private        : %s\n", private_);
        formattedWrite(sink, "tangible       : %s\n", tangible);
        formattedWrite(sink, "collidable     : %s\n", collidable);
        formattedWrite(sink, "global         : %s\n", global);
        formattedWrite(sink, "persistent     : %s\n", persistent);
        formattedWrite(sink, "padding[0]     : %s\n", padding[0]);
        formattedWrite(sink, "padding[1]     : %s\n", padding[1]);
        formattedWrite(sink, "padding[2]     : %s\n", padding[2]);
    }
}
 
// Denetleyelim
static assert (VuEntity.sizeof == 60);
 
align(1)
struct Falcon4Entity {
    align(1):
    VuEntity vuClassData;
    short[7] visType;
    short vehicleDataIndex;
    ubyte dataType;
    uint dataPtr;
 
    void toString(void delegate(const(char)[]) sink) const {
        formattedWrite(sink, "%s", vuClassData);
        formattedWrite(sink, "visType         : %s\n", visType);
        formattedWrite(sink, "vehicleDataIndex: %s\n", vehicleDataIndex);
        formattedWrite(sink, "dataType        : %s\n", dataType);
        // Dosyadan okunan dataPtr anlamsızmış; yazdırmıyoruz    
    }
}
 
// Denetleyelim
static assert ((Falcon4Entity[2]).sizeof == 81 * 2);
 
Falcon4Entity[] oku() {
    auto dosya = File("FALCON4.ct", "rb");
 
    short numEntities;
    auto okunanAdet = dosya.rawRead((&numEntities)[0..1]);
    enforce(okunanAdet.length == 1, "HATA: Adet değerini okuyamadım");
 
    auto entities = new Falcon4Entity[](numEntities);
    entities = dosya.rawRead(entities);
    enforce(entities.length == numEntities,
            format("HATA: %s yerine yalnızca %s nesne okudum", numEntities, entities.length));
    return entities;
}
 
int main(string[] args) {
    Falcon4Entity[] entities = oku();
    foreach (entity; entities) { 
        writefln("%s", entity);
    }
 
    return 0;
}
E=mc^2
cos00kun #50
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
peki dosyanın herhangi bir bytına imleçi götüren bir olanak yokmu ? yani bizi dosyanın bilmem kaçıncı baytına git imleç(sözde imleç) orda dursun birşeyler okurken bu imleçten okumaya başlasın gibi mesela ? çünkü niye sordum böylece sadece istediğim sıradaki kaydı tüm datayı okutmadan ekran getirebilirim. (Elbette başka bir konu bu yoksa program şu an için istediğim noktaya geldi)
E=mc^2
cos00kun #51
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
sanırım SEEK_SET bu işi görüyor..  burada offseti verilen byte kadar ileriye taşıyarak işlemlerin ordan başlaması sağlanıyor burada ben 2 demişim yani 2 byte sonra offseti başlatıyor 0 ve 1. bytları atlamış oluyor.. (Erdem hocam daha önce verdiğiniz sitede bunu net anlatmış tekrar teşekkürler)
import std.exception;
import std.stdio;
import std.string;
 
void main(string[] args)
{
    ushort[] id;
    id.length = 1;
 
    auto dosya = File("FALCON4.ct", "rb");
    dosya.seek(2, SEEK_SET);
    
    auto satır = dosya.rawRead(id);
    writeln("Okuduğum satır.. ", satır);
    readln();
}
Burada bizim ana programa etkisi şu olabilir; şu an itibariyle benim dosyada aslında 3956 kayıt var(her kayıt 81 bye uzunluğunda) 2 byte da başta bu numarayı tutan kayıtla beraber 3958 bu durumda diyelimki 6.kayıdı okuturken tüm dosyaları okutmadan direk olarak  dosya.seek((6*81 +2 ), SEEK_SET); yaparak o kayıttaki 81 byte okutursam çok kısa sürede istediğim kayda ulaşmış olucam ..
E=mc^2
acehreli (Moderatör) #52
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4643 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İsteyenlere bir problem. :) Aşağıdaki iki yöntemi karşılaştırınız:

a) SEEK_SET yöntemiyle belirli yerdeki kaydı okumak

b) Bütün veriyi önceden yaptığımız gibi tek seferde okuyup dizideki belirli elemanı kullanmak

Hangisi hızlı? Ne kadar? Tabii ki sonuç kaç adet veriyle ilgilendiğimize ve dosyanın boyutuna bağlı olacaktır. Örneğin, belki tek kayıt okurken a daha hızlı çıkacaktır ama örneğin 20 kayıta bakacaksak 3 bin kaydın hepsini birden okuyan yöntem daha hızlı çıkacaktır. (Hiç denemeden yazdım; bilmiyorum.)

Ali
cos00kun #53
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam ben şimdiki bilgilerim doğrultusunda şunları söyleyebilirim

a yönteminde;
1- dosyayı aç
2- offseti SEEK_SET ile yerleştir.
3- veriyi değişkene aktar.
4- herhangi bir yere (ekran/görsel bileşen) yaz

b yönteminde;
1- dosyayı aç
2- verilerin tamamını değişkenlere aktar.
3- herhangi bir yere (ekran/görsel bileşen) yaz

kaba bi tahminle a da SEEK_SET ile fazladan bir zaman harcanıyor ancak yüm değişkenlere atama yapılmayıp tek değpişkene atama yapıldığından yinede avantajlı.. Bu durumda sanki bana göre dosyanın %40-50 si kadar byte okunacaksa  a yöntemi daha fazlası için b yöntemi daha iyi gibi..  :-p
E=mc^2
acehreli (Moderatör) #54
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4643 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Düşününce her sonuç çıkabiliyor. Örneğin, 10 elemana bakacaksak SEEK_SET yöntemi diskin farklı yerlerinden okumak zorunda olacağından okuma kafasının oralara gitmesini beklemek zaman alabilir. (Tabii disk SSD ise okuma kafası diye bir kavram yok.)

Öte yandan, hepsini okuyan yöntem bir kere okuma yerini buldu mu hızlıca okuyabilir ve SEEK_SET'ten daha hızlı işleyebilir.

Görüldüğü gibi, kafada canlandırmaya gelince hikaye çok... :) Tam ne olacağını denemeden bilemiyoruz.

Aslında üçüncü bir yöntem daha var: Dosyayı memory mapped dosya olarak açmak, elemanlara sanki belleğe okunmuşlar gibi doğrudan ulaşmak. Memory mapped dosyalarda gereken okumaları işletim sistemi halleder.

Hangi yöntemin hangi durumlarda daha hızlı olacağını bilmiyorum. Ama tabii hiç de hızlı okumak gibi bir derdimiz olmayabilir. Öğretici olabilecek bir problem...

Ali
cos00kun #55
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu durumda Memory mapped çok daha hızlı olur sanırım peki Ali hocam  ama bunun maaliyeti nedir yada ne gibi dezavantajları olur ? sonuçta ben vahsettiğim dosyalar içinde görsel bileşenleri kullanarak düzenleme işi yapacağım
E=mc^2
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3  4 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2018-02-24, 02:22:27 (UTC -08:00)