Info zu schneller File I/O



  • Hallo erstmal,

    Ich habe ein unbekanntes Dateiformat forgegeben bekommen.
    Es besteht aus einem 1 kByte großen Header und einer unbestimmten Anzahl von nochmal 1 kByte großen Blöcken.

    Ich soll nun diese Format weiter entwickeln und eine Möglichkeit schaffen Daten von einer My-Sql-Datenbank in diese Datei zu schreiben (bzw. umgekehrt) und letztendlich auszuwerten. Unter Daten ist in meinem Fall einfach nur ein Zeitstempel und der dazugehörige Wert zu verstehen. (2* double wegen der Genauigkeit)

    Mein Problem ist das der Zugriff einfach nur schnell sein Muss.

    Spielt da diese 1 kByte irgendeine Rolle ? 😕

    Ich verwende MS Window 2000 den BCB 6 und fopen,fread und fwrite.

    Möre



  • Frage: Wie kannst du denn ein unbekanntes Dateiformat weiterentwickeln 😕



  • Möre schrieb:

    Ich verwende [...] fopen,fread und fwrite.

    Dann passt das ja einwandfrei nach "Rund um", da nicht BCB-spezifisch.

    Verschoben.



  • schnell kannst du das machen, in dem du einfach die Datei erst im Speicher veränderst und erst ganz am schluß auf den (langsamen) Datenträger schreibst. Unter Unix gibt es die Funktion mmap(2) dafür.



  • Und was bringt dir das schnelle auslesen der Datei.
    IMHO liegt der Flaschenhals am Netzwerk. (Connect zu MYSQL)
    MYSQL mag ja schnell sein aber ein Connect,Execute,Close ist nicht schneller als I/O. Somit kannst du wören des einlesens von der Datei bereits anfangen MYSQL zu bedienen. Bis du das File eingelesen hast kannst du aber vieleicht 50 INSERTS absetzen. Insebsonders wenn noch andere auf den MYSQL mit select zugreifen wir es ein Problem da ein Select vor eim INSERT geht und die INSERTS erst TEMP gespeichert werden. Irgendwann ist aber auch der Speicher voll wenn er nicht durch MYSQL geleert wird da soviele SELECTS sind.
    Und dann heist es sowieso warten. Somit kannst I/O vernachläßigen und dich lieber um eine Threaddesign kümmern.



  • Hi

    @bais
    Wie die Datei grob aussieht hab ich doch schon beschrieben und wenn ich dir sage das es sich um eine *.d00 Datei handelt sagt dir das auch nicht mehr, darum unbekannt.

    @kingruedi + @UnixTom
    Das die Datenbank irgendwo auf dem Netz liegt ist eigentlich egal. Da beim Start meiner Anwendung die Datei erst erstellt wird. d.h. Am Anfang wartet der Nutzer erstmal. Hauptsache ist das eine Datei da ist, und zwar auf dem Rechner auf dem auch auf sie zugegriffen wird. Test mit einer mySQL-Datenbank und verschiedenen Zugriffen(auch über Threads) waren einfach zu langsam, wegen dem Flaschenhals Netzwerk. Vielen Dank trotzdem.

    Meine Frage war ja eigentlich bringt es Vorteile, wenn ich die Datei in ein kByte Blöcke unterteile?? 😕 (vom Betriebssystem, oder von sonst irgend etwas her) Oder ist das schlicht weg egal.



  • die Unterteilung in verschiedene Blockgrößen, kann je nach benutztem Laufwerk und benutztem Filesystem nützlich sein. Aber heutzutage sollte so etwas kaum messbar sein.



  • http://developer.apple.com/samplecode/Sample_Code/Files/MapLargeFile.htm

    ist zwar nicht Windows-spezifisch, aber paßt dafür unter Umständen in Dein Konzept...

    Gute Jagd Winn


Log in to reply