Frage

Ich möchte eine Bibliothek verwenden, die Anwendungen Filedeskriptoren als die grundlegenden Mittel, um seine Daten zuzugreifen. Aus Performance-Gründen möchte ich nicht Dateien jeweils auf die Festplatte zu begehen, bevor ich diese Bibliothek Funktionen nutzen.

Ich möchte (große) Daten Blobs on the fly erstellen und Anruf in die Bibliothek sie an einen Server zu senden. Wie es aussieht, muss ich die Datei auf die Festplatte schreiben, öffnen Sie es, die FD in die Bibliothek übergeben, warten, bis es zu beenden, dann die Datei auf der Festplatte löschen. Da ich die Blobs auf Nachfrage neu erstellen kann (und sie sind nicht so groß, dass sie übermäßigen virtuellen Speicher Paging verursachen), so dass sie auf der Festplatte kauft mir nichts, und verursacht eine große Leistungseinbuße zu speichern.

Ist es möglich, eine FD zu einem Block von Daten, die wohnen nur als Memory-Mapped-Einheit zuweisen?

War es hilfreich?

Lösung

Sie könnten montieren ein Speicher gesicherte Dateisystem : http://lists.apple.com/archives/darwin-kernel/2004/Sep/msg00004.html

Mit diesem Mechanismus wird Speicherdruck auf dem System zu erhöhen, und wahrscheinlich ausgelagert werden, wenn Speicherdruck groß genug ist. Es könnte sich lohnen, es eine Konfigurationsoption zu machen, falls der Benutzer lieber eine andere Anwendung haben erste Wahl des Speichers.

Eine weitere Option ist die POSIX Speichersegmente geteilt : http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html (ich habe nicht verwendet POSIX Shared-Memory-Segmente selbst;., wenn ich sie richtig verstanden hat, wurden sie genau dieses Problem zu lösen entworfen)

Die shm_open() Funktion erzeugt ein Speicherobjekt und gibt einen Dateideskriptor. Sie könnten dann die Datei-Descriptor mmap(2), tun Sie Ihre Arbeit, und übergeben den Dateideskriptor in die Bibliothek.

Vergessen Sie nicht, um das Objekt zu shm_unlink wenn Sie fertig sind; POSIX Shared-Memory-Segmente, Nachrichtenwarteschlangen und Semaphore-Arrays nicht automatisch weg, wenn die letzten Prozess beendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top