Anhängen an eine memory-mapped-Datei
Ich bin ständig Anhängen an eine Datei von stock quotes (ints, longs, doubles, etc.). Ich habe diese Datei in den Speicher gemappt mit mmap.
Was ist der effizienteste Weg, um neu angefügten Daten verfügbar als Teil des memory-mapping?
Ich verstehe, dass ich die Datei erneut öffnen (neuer file-Deskriptor) und dann mmap es zu Holen Sie sich die neuen Daten aber das scheint mir ineffizient. Ein weiterer Ansatz, der vorgeschlagen wurde, der mir vor-reservieren Sie die Datei in 1 MB-Blöcken geschrieben, schreiben zu einer bestimmten position, bis das Ende dann ftruncate die Datei +1 MB.
Gibt es andere Ansätze?
Tust Steigern helfen mit diesem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Steigern.IOStreams hat eine Feste Größe nur memory-mapped-Dateien, so dass es nicht helfen wird, mit Ihrem spezifischen problem. Linux hat eine Schnittstelle
mremap
die funktioniert wie folgt:Dies ist nicht tragbar, jedoch (und schlecht dokumentiert). Mac OS X scheint nicht zu haben
mremap
.In jedem Fall, Sie nicht brauchen, um die Datei erneut öffnen, nur
munmap
es undmmap
es wieder:Pre-allocation Schema kann hier sehr hilfreich. Werden Sie sicher, verfolgen Sie die Datei, die die tatsächliche Länge abschneiden und es noch einmal vor dem schließen.
Kenne ich die Antwort bereits akzeptiert, aber vielleicht wird es jemand anderes helfen, wenn ich Ihnen meine Antwort. Reservieren Sie eine große Datei vor der Zeit, sagen wir 10 GB. Erstellen Sie drei Dateien vor der Zeit, ich nenne Sie Bände. Behalten Sie Ihre Letzte bekannte Position irgendwo wie in der überschrift, eine andere Datei, etc. und dann halten Sie Anhängen aus, dass Punkt. Wenn Sie erreichen die maximale Größe der Datei und der Zimmer wechseln, um die nächste Band. Wenn es keine weitere volumes, erstellen Sie ein anderes Volumen. Beachten Sie, dass Sie wahrscheinlich tun Sie dies ein paar Bände Voraus, um sicherzustellen, nicht zu blockieren, fügt warten auf ein neues volume erstellt werden. Das ist, wie wir es umsetzen, in dem ich arbeite für die Speicherung von kontinuierlichen eingehenden video - /audio-in DVR-system für die überwachung. Wir verschwenden Speicherplatz zum speichern der Datei-Namen für die video-clips, die ist, warum wir nicht mit einem real-Datei-system und anstelle wir gehen flat-Datei und verfolgen wir nur offsets, frame-Daten (fps, frame-Typ, Breite/Höhe, etc.), Zeit erfasst und Kamera-Kanal. Für Sie Speicherplatz ist Billig für die Art von Arbeit, die Sie tun, während Ihrer Zeit von unschätzbarem Wert ist. Also, packen Sie so viel wie Sie wollen, vor der Zeit. Sie sind im Grunde die Umsetzung Ihrer eigenen Datei-system optimiert für Ihre Bedürfnisse. Die Bedürfnisse, die allgemein-verwenden Sie Datei-Systeme liefern nicht die gleichen Bedürfnisse, die wir brauchen, in anderen Bereichen.
Blick auf man-Seite für mremap sollte es möglich sein.
Meine bei 5 cents, aber Sie sind mehr C-spezifisch.
Machen normale Datei, aber mmap-große Größe - e.g-Datei ist sagen wir 100K, aber mmap 1GB oder mehr. Dann kann man bedenkenlos zugreifen, alles bis auf die Datei Größe. Zugriff über Datei-Größe führt zu Fehler.
Wenn Sie auf 32bit OS, just dont make mmap zu groß, weil es wird Essen Ihr Adressraum.
Wenn Sie
boost/iostreams/device/mapped_file.hpp
auf windows:boost::filesystem::resize_file
löst eine Ausnahme aus, wenn eine lese-mapping-Objekt geöffnet ist, wegen fehlender Freigabe-Berechtigungen.Verwenden Sie stattdessen windows-api, um die Größe der Datei auf der Disk, und das Lesen
mapped_file
s kann immer noch offen sein.