Filpointer immer am Anfang: ineffizient?
-
@Konvertierer:
Kapier ich nicht was dir das bringt... Wenn du soviele Dateien hast, dann musst du doch sowieso jede Datei öffnen und schliessen...ga_un schrieb:
Ist das zeitaufwendig, wenn der filepointer immer hin und her springt?
Ja. Denn die streams sind nicht auf das seeken ausgelegt.
Da geht zB jedesmal die ganze pufferung flöten...
-
@shade
ich versuchs noch einmal zu erklären:
Dú hast eine Datei
bla
blubb
test
hallo
du
er
sie
hallound davon so ca. 1000 Stück und mehr. Jetzt sollst du in jeder Datei z.b. nach doppelten einträgen suchen, nach bestimmten wörtern usw.
Erste möglichkeit:
Du schreibst eine Funktionvoid Suche_Doppelte_Eintraege() { // datei öffnen // suchen // datei schließen }
dann
void Suche_Wort() { //datei öffnen // suchen //schließen }
D.h. du untersuchst jede der über 1000 Dateien auf meinetwegen 50 verschiedene sachen, du öffnest sie in jeder funktion wieder und schließt sie wieder.
Und das schließen dauert aber so dermaßen lange das du sie nicht schließt sondern in jeder Funktion einfach wieder auf die 0te Position springst weils echt schneller geht.Wie in dem anderen Thread gefragt, für eine bessere variante bin ich immer zu haben!
-
Ich habs immernoch nicht kapiert. Weil du ja die Datei trotzdem irgendwie schliessen und die nächste öffnen musst...
Vielleicht steh ich auch auf der Leitung
Konvertier schrieb:
Wie in dem anderen Thread gefragt, für eine bessere variante bin ich immer zu haben!
Memory Mapping.
Du mappst die Datei in einem rutsch in den Speicher, mmap() und CreateFileMapping() für Unix/Windows (wenn ich nicht irre)
Denn du scheinst die streams für etwas zu verwenden, für das sie nicht gemacht wurden.
-
keine Ahnung was du sonst noch für Funktionen bereitstellen möchtest. Aber du könntest, zb. jede Datei sortieren. Dann kannst du schneller Wörter finden und auch doppelte Einträge etc. Du könntest auch noch mehr Informationen halten, zb. kann jedes Wort eine Zahl dahinter haben die angibt wie oft es in dieser Datei vorkommt etc.
Dann die Datei nur einmal öffnen und jede Operation drauf anwenden die du auf diese Datei anwenden möchtest, also dieser öffnen schließen Kram in jeder Funktion. Und mit den ungepufferten Streams, gibt nich auch gepufferte?Shade
*****er öffnet die datei jedesmal wenn er eine Funktion aufruft, so hab ich das verstanden.
tschöö
tt
-
Gut das ich noch nicht weiter gearbeitet habe sondern erstmal frage
Du bist schon nah dran,
Ich habs immernoch nicht kapiert. Weil du ja die Datei trotzdem irgendwie schliessen und die nächste öffnen musst...
Sicher, ich muss 1000x eine Datei öffnen und schließen.
Du meintest jetzt aber man soll nicht mit dem filepointer einfach an den anfang einer datei springen. Jetzt fällt mir aber keine andere methode ein wieder zum Anfang zu gelangen außer in jeder Funktion jede Datei zu öffnen und wieder zu schließen.
D.h.
50 Funktionen, 1000 Dateien = 50000 mal öffnen und schließen statt nur 1000x wenn ich den filepointer auf 0 setze.Bitte sag mir wenn ich da was grundlegendes falsch mache, dass ist mir total wichtig!
-
@thetester das mit dem schließen war auch meine idee, hier der code:
unsigned int CAnalyze::Check_Players() { for(int i=0; i<vplayer.size(); ++i) { //Dateien öffnen // Funktion ausführen playerLogfile.clear(); playerLogfile.seekg(0); // Funktion ausführen playerLogfile.clear(); playerLogfile.seekg(0); // Funktion ausführen // Dateien schließen } return(1); }
Ich weiß halt nicht wie es noch besser geht!
-
wie gross sind deine Dateien ?
wenn du die daten von 2 dateien gleichzeitig im Speicher haellst, bekommst du dann Ressourcenprobleme ?Ciao ...
-
gute Frage, theoretisch ist es so: Es läuft eine Übung ab und diese wird in einem Riesenfile protkolliert (bis die platte voll ist, also gigabytegröße....)
Weil man mit einer nicht arbeiten kann spalte ich diese auf, für jeden teilnehmer eine.
Bei einem 400 mb file was ich gerade immer teste sind das so pro spieler 4-18 mb .
Könnte also passen das ich 2 im speicher halte
-
Aso, du willst jede Datei 50mal öffnen... Sag dass doch gleich
Dann ist das seek natürlich angebracht. Frage ist nur, ob man das wirklich braucht. Kann man die Datei denn nicht einfach nur einmal durchgehen??
Naja, File Mapping ist da aber sicher die beste möglichkeit - da hat man das seek mit ner pointer addition (bzw. subtraktion) erledigt.
-
Ich hab jetzt mal darüber nachgedacht, theoretisch könnte ich ja eine Datei öffnen und in einem vector speichern und dann arbeiten die Funktionen mit dem Vector, d.h. das springen mit dem pointer würde entfallen.
Aber wäre das denn auch schneller?