Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Datei schnell abspeichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.10.2006, 14:36 Uhr
KBlaubaer



Hi Leute,
mal ne Frage... oder kleine Diskussionsrunde...
Ich möchte(muss) eine Datei möglichst schnell auf die Platte (CF-Karte) speichern. Das System ist ein embedded-PC, dem einfach der Saft abgeschalten wird und somit die Zeit zum speichern für die Daten recht knapp bemessen ist.
Das System läuft mit MS-DOS und Progrmmierung mit Borland-C. Nach ersten Messungen mit normal "fopen ... fclose", ist die notwendige Zeit recht unregelmäßig und gefühlsmäßig ziemlich lang bis der fertig ist damit. Wie macht man das also am schnellsten, das eine geöffnete Datei ihre Daten bekommt und geschlossen wird? Auch habe ich gemessen, dass eine große Datei vergleichsweise viel schneller gepeichert wird, als mehrer kleine.
Zum Schuß noch eine Frage für die Zukunft... geht das prinzipiell unter Linux schneller? Aber das ist scht nicht das jetztige Problem, es muss zunächst mit DOS laufen.
Danke für Meinungen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.10.2006, 15:08 Uhr
Pablo
Supertux
(Operator)


also schneller als fopen/fclose wirst du wahrscheinlich nicht hinkriegen, außer vielleicht wenn du die OS-API Funktionen benutzt, die (meiner Meinung nach) nur minimal schneller sein werden.

Ich arbeite mit Embedded Systems (PC400) und bei uns laufen die Dinger mit Slackware und Gentoo. Ich finde, es gibt keinen Unterschied, was die Zeit angeht, diese embedded System laufen genuaso schnell wie die üblichen P3 Rechner.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.10.2006, 15:52 Uhr
ao

(Operator)


Das ist ein Problem, weil Flash-Schreiben a) lange dauert und b) viel Strom frisst - verglichen mit anderen Speichertechniken. Ich sehe folgende Möglichkeiten:
1. Stützbatterie einsetzen, die das System lange genug am Laufen hält, ein paar Sekunden oder höchstens eine Minute reicht vielleicht schon.
2. Batteriegepuffertes SRAM statt Compact-Flash, braucht weniger Zeit zum Schreiben.

Das kostet alles Geld, aber ich fürchte, eine reine Softwarelösung kriegst du nicht stabil. Oder das hier:

3. Damit leben, dass die Dateien möglicherweise nicht korrekt geschrieben und geschlossen werden. Kommt nur dann in Frage, wenn auf die Daten zur Not verzichtet werden kann.

Dieser Post wurde am 09.10.2006 um 15:53 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.10.2006, 16:07 Uhr
KBlaubaer



Ich brauch die Daten zu 100% !
Ich habe das System schon am laufen, mit dickem Kondensator. Bei Unterspannungdetektion gibts einen Interrupt und es bleiben ca. 600ms bis zum Reset.
Mit SRAM und so habe ich das bei Controllern gemacht, wunderbar... Hier will ich eigentlich nur eine softwaremäßige Optimierung finden... Ich weiß es ist nicht so doll, doch es muss doch möglich sein in einer halben Sekunde knapp 300kB zu schreiben. (geht auch, aber bin eben nicht so ganz glücklich...)
Vielleicht gibts noch paar Kniffe um direkt auf die Platte zu schreiben und/oder das DOS mit seinen ganzen Buffern und ähnlichem lahmen Kram zu umgehen, oder auf die Sprünge zu helfen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.10.2006, 16:10 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Öhm wenn der Saft weg ist ist der Saft weg, wie soll da noch was gespeichert werden? Oder hat das Gerät noch so ne Art Notstrom um geregelt runter zu fahren? Dann sollte aber doch vorher alles gespeichert werden. Außerdem speichert fclose nichts sondern macht nur die Datei zu. Du könntest aber mit fflsuh() nach jedem schreibvorgang erzwingen das der Puffer geleert wird und die Sachen direkt auf die Festplatte geschrieben werden, allerdings macht es das nicht unbedingt schneller...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.10.2006, 16:28 Uhr
KBlaubaer



Hey du schrecklich wichtiger Pirat (ewig ist es her... Gruß an alle die MonkeyIsland 1 & 2 durchgespielt haben ) ... habe 600ms Zeit... siehe oben.
Um das mal auf die Spitze zu treiben -> kann ich nicht direkt auf bestimmte Sektoren o.ä. auf die Platte schreiben... ok, das ist schon hardcore... ich weiß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.10.2006, 16:32 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wo kommt der Wert 600ms her? Ist das eine Herstellerangabe oder hast du das irgendwie gemessen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.10.2006, 16:35 Uhr
ao

(Operator)



Zitat von Guybrush Threepwood:
Du könntest aber mit fflsuh() nach jedem schreibvorgang erzwingen das der Puffer geleert wird und die Sachen direkt auf die Festplatte geschrieben werden, allerdings macht es das nicht unbedingt schneller...

Es kann sein, dass man damit das Runterfahren bei Powerdown tatsächlich geregelt hinbekommt, wenn nämlich sichergestellt werden kann, dass keine oder nur geringe Datenmengen weggeschrieben werden müssen.

Trotzdem würde ich bei Flashdisks genau das nicht empfehlen, die schreiben nämlich nicht jedes Byte einzeln, sondern immer ganze Blöcke. Und weil sie die Blöcke erst löschen müssen, um sie anschließend neu schreiben zu können, wird die Über-Alles-Performance während der normalen Laufzeit deutlich schlechter, und die Lebensdauer der Flashdisk wird auch verkürzt.

Du kannst das ja mal testweise so machen, nach jedem fwrite oder fprintf, oder was du benutzt, ein fflush machen. Wenn die Flashdisk eine Access-LED hat, wirst du sehen, dass die viel mehr leuchtet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.10.2006, 16:40 Uhr
ao

(Operator)



Zitat von KBlaubaer:
Ich habe das System schon am laufen, mit dickem Kondensator. Bei Unterspannungdetektion gibts einen Interrupt und es bleiben ca. 600ms bis zum Reset.

Schalt noch einen Akkupack dazu, dann hast du reichlich Reserve. Du musst den Akku ja nicht leerlaufen lassen; wenn du den Interrupt bekommst, sicherst du die Daten und machst anschließend den Embedded-PC aus, das schont den Akku.

Nur ab und zu muss das ganze System so lange laufen, dass der Akku Zeit zum Aufladen hat.

Zitat:
Vielleicht gibts noch paar Kniffe um direkt auf die Platte zu schreiben und/oder das DOS mit seinen ganzen Buffern und ähnlichem lahmen Kram zu umgehen, oder auf die Sprünge zu helfen...

Da gibts keinen lahmen Kram. Um selber so schnell zu werden wie die Filesystem-Treiber, musst du dich schon anstrengen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.10.2006, 16:48 Uhr
KBlaubaer



Ok, ich hole mal bissel aus zum Verständnis...
Das System ist 'nen kleiner DIMM-PC (133MHz 486), welcher in einer black-box werkelt. Bei PowerON fährt die Kiste ganz normal hoch, lädt eine Datei vom Laufwerk D (Flash-Disk ausreichend schnell: Sandisk ULTRA II) und schließt die Datei wieder. Es wird eine Datei geöffnet, wo die Daten zum PoweerOFF abgespeichert werden sollen. Während der gesamten Laufzeit wird nun nix mehr gelesen oder geschrieben. Nun kommt der Interrupt von der Unterspannungsdetektion, es bleiben bis zum RESET ca. 600ms Zeit. Jetzt hurtig hurtig die Daten in die offene Datei schreiben und Datei schließen... und dann sterben.
Als Controller-Entwickler liebe ich definierte Zeiten für Aktionen, dies ist eben leider unter dem Mini-PC und DOS und der Anwendung nicht so... versuche es einfach zu verbessern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: