Maximale Menge an File Pointern?



  • Stellt sich allerdings die Frage, ob man 500 offene Files überhaupt braucht...



  • Ja, die Frage habe ich mir auch schon gestellt.

    Ich bekomme nach und nach immer mehr Objekte rein, die ich einzeln loggen und später auswerten möchte. Momentan bekommt jedes Objekt eine eigene Datei. Die Objekte sterben irgendwann wieder aus und die Datei wird geschlossen. Am Ende habe ich um die 10000 Dateien, die ich auswerte, wobei selten mehr als 500 Objekte gleichzeitig aktiv bzw. Dateien entsprechend geöffnet sind.

    Man könnte jetzt natürlich alles in eine Datei schreiben, für jedes Objekt einen großen Block in der Datei reservieren und über die Fileposition immer an die richtige Position springen. Damit hätte ich eine Datei im GB-Bereich, was auch nicht so tragisch wäre.

    Irgendwelche anderen Ideen?



  • Na gut... du scheinst echt viele Daten zu haben... In dem Fall würde ich vermutlich auch mehrere Dateien anlegen, anstatt ständig in einer einzigen rumzuspringen.

    Ein andere Möglichkeit wäre, die Daten zu puffern und dann in regelmäßigen Abständen auf die Platte zu schreiben und die Datei dann wieder zu schließen.
    evtl. über einen gesonderten Thread...

    Aber um das beurteilen zu können, fehlt mir die genauere Kenntniss deines Projektes.



  • Du kannst die Dateien auch zwischendurch schließen, wenn du sie nicht brauchst. Das kostet zwar eventuell etwas Performance, dafür bietet es sich gerade fürs Logging an, weil die Dateipuffer beim schließen geflusht werden und damit a) die Dateien stets aktuell sind und b) falls das Programm abstürzt nicht mittendrin abgeschnitten sind.



  • Du kannst auch alles in eine Datei hintereinander schreiben. Bei dieser großen Datenmenge wirst du um eine Aufbereitung zur Auswertung nur schwer vorbei kommen.



  • Bashar schrieb:

    Du kannst die Dateien auch zwischendurch schließen, wenn du sie nicht brauchst. Das kostet zwar eventuell etwas Performance, dafür bietet es sich gerade fürs Logging an, weil die Dateipuffer beim schließen geflusht werden und damit a) die Dateien stets aktuell sind und b) falls das Programm abstürzt nicht mittendrin abgeschnitten sind.

    Das kostet unglaublich viel Performance. Habs schon ausprobiert.

    grep schrieb:

    Du kannst auch alles in eine Datei hintereinander schreiben. Bei dieser großen Datenmenge wirst du um eine Aufbereitung zur Auswertung nur schwer vorbei kommen.

    Dann müsste ich jedes einzelne Objekt am Ende "rekonstruieren", was mir bislang erspart geblieben ist. Der damit verbundene Aufwand ist mir zu groß. Ich müsste dann ja auch 10000 Objekte anlegen (vermutlich im RAM) und beim Auslesen nach und nach die Daten den Objekten zuordnen.


  • Mod

    Woher bekommst Du denn die Handles?
    Warum machst Du so viele Dateien überhaupt auf? 😉



  • Wie oft machst du denn diese Schreiboperationen?

    100 pro sekunde? 1000?

    Weil irgendwann muss man sich dann mal überlegen, ob die generelle Herangehensweise die bestmögliche ist...

    Wie is das mit dem Puffern? Wäre das bei dir möglich?



  • Martin Richter schrieb:

    Woher bekommst Du denn die Handles?
    Warum machst Du so viele Dateien überhaupt auf? 😉

    Also die File Pointer speichere ich in meiner Objektliste. Jedes Objekt hat eine eindeutige ID, einen File Pointer und seine Datenstruktur. Im RAM und damit in der Objektliste befinden sich nur die aktiven Objekte.
    Ich mache momentan so viele Dateien auf, weil ich nicht weiß, wie ich es eleganter lösen soll.

    It0101 schrieb:

    Wie oft machst du denn diese Schreiboperationen?

    100 pro sekunde? 1000?

    Weil irgendwann muss man sich dann mal überlegen, ob die generelle Herangehensweise die bestmögliche ist...

    Wie is das mit dem Puffern? Wäre das bei dir möglich?

    So unglaublich oft wird eigentlich gar nicht geschrieben. Über 10 Sekunden verteilt eben so oft wie es Objekte gibt (bis zu ~500 mal), also 50 mal pro Sekunde. Um die Dateien jedes mal wieder zu öffnen/schließen aber offensichtlich doch zu häufig.

    Ich wüsste spontan nicht, wie ich das über Puffer realisieren sollte. Wie lange puffere ich? Wie füge ich am Ende alles wieder korrekt zusammen?

    Noch ein Versuch das Projekt etwas genauer zu beschreiben:

    Eine Antenne dreht sich mit einer Umdrehungszeit von 10 Sekunden. Die Antenne detektiert Objekte und ich speichere diese in der o.g. Objektliste. In der nächsten Antennenumdrehung werden viele der Objekte wieder auftauchen, reidentifiziert und damit ihren vorhergegangenen Detektionen zugeordnet (in diesem Fall wird kein neues Objekt angelegt). Ein paar Objekte werden neu hinzukommen und bekommen entsprechend einen neuen Platz in der Objektliste. Wenn ein Objekt 5 Antennenumdrehungen lang keine Detektion mehr hatte, wird es aus der Objektliste gelöscht.
    Die Objektliste beinhaltet also alle aktiven Objekte. Es wird im Moment für jedes Objekt eine Datei angelegt und die Daten jedes Scans in der Datei geloggt. Verschwindet das Objekt, wird die Datei geschlossen. Ganz am Ende werden alle Dateien ausgewertet. Dabei ist es wichtig, jedes Objekt gesondert betrachten zu können. Deshalb habe ich mich bisher davor gescheut, alles in eine Datei zu schreiben, weil ich mir das "Rekonstruieren" schwierig vorstelle.



  • Wäre es da nicht sinnvoll, die Objekte erstmal im Speicher zu halten und dann auf die Platte zu schreiben, wenn sie verschwunden sind?

    Oder gibt es einen Grund, warum man dauernd auf die Platte schreiben muss?
    Werden die Dateien parallel von einer anderen Applikation gelesen?



  • Man könnte die ganze Pufferung auch selbst managen. BTW muss es unbedingt stdio sein, iostream liegt doch viel näher? Dann könnte man sich einen filebuf basteln, der das Dateihandle nicht die ganze Zeit geöffnet hat, und sich somit unabhängig von den Betriebssystemresourcen machen.



  • Man muss das doch nicht sofort in einen buffer schreiben.

    Man kann doch die Daten / Informationen / wasauchimmer erstmal in Form einer Struktur in einen Container laden und zum gegebenen Zeitpunkt dann alles auf die Platte brennen.



  • It0101 schrieb:

    Wäre es da nicht sinnvoll, die Objekte erstmal im Speicher zu halten und dann auf die Platte zu schreiben, wenn sie verschwunden sind?

    Oder gibt es einen Grund, warum man dauernd auf die Platte schreiben muss?
    Werden die Dateien parallel von einer anderen Applikation gelesen?

    Ich schreibe es auf die Platte, weil ich den Arbeitsspeicher nicht zu stark beanspruchen möchte. Das war zumindest als ich mit dem ganzen Quatsch angefangen habe die Überlegung gewesen. Wenn ich das jetzt nochmal durchrechne, komme ich gerade mal auf 100MB, die ich allokieren müsste. Das ginge eigentlich. Bin jetzt ehrlich gesagt etwas verunsichert, weil ich mir nicht sicher bin, ob ich nicht irgendwas vergesse oder ob ich vor ein paar Wochen einfach daneben war.

    Ich werde das so mal versuchen - auch wenn das heißt wieder alles umzuschmeißen 🙄

    Vielen Dank für die vielen hilfreichen Kommentare!

    Edit: Sind doch 600MB. XML Files wären auch noch eine Alternative, aber damit kenne ich mich wieder nicht aus.


Anmelden zum Antworten