Java Memory-Mapped-Dateien?

8

Sind Memory-Mapped-Dateien in Java wie Memory-Mapped-Dateien für Windows? Oder ist es nur die Emulation basierend auf Speicher- und Dateioperationen in Java?

    
Edward83 23.11.2010, 22:25
quelle

2 Antworten

10

Es verwendet die Betriebssystemunterstützung für Speicherabbilddateien.

Ich versuche eine Dokumentation zu finden, die das bestätigt, aber ich habe noch nichts Schlüssiges gefunden. Allerdings sagen verschiedene Teile der Dokumentation solche Dinge:

  

Viele der Details von Speicherabbilddateien hängen von Natur aus vom zugrunde liegenden Betriebssystem ab und sind daher nicht spezifiziert. Das Verhalten dieser Methode, wenn die angeforderte Region nicht vollständig in der Datei dieses Kanals enthalten ist, ist nicht angegeben. Ob Änderungen am Inhalt oder an der Größe der zugrunde liegenden Datei von diesem oder einem anderen Programm an den Puffer weitergegeben werden, ist nicht spezifiziert. Die Rate, mit der Änderungen an dem Puffer an die Datei weitergegeben werden, ist nicht angegeben.

Wenn alles nur nachgebildet wäre, wäre ein solches nicht spezifiziertes Verhalten nicht nötig.

    
Jon Skeet 23.11.2010, 22:28
quelle
9

Wenn Sie zwischen den Zeilen Ihrer Frage und Ihres Kommentars lesen, versuchen Sie eine Memory-Mapped-Datei zu verwenden, um Speicher / Objekte zwischen einer Java- und C ++ - Anwendung freizugeben.

Mein Rat lautet: Versuche nicht, dies zu tun .

Es gibt schwierige Probleme, die behoben werden müssen, um dies zu gewährleisten:

  • Synchronisierung der Nutzung der gemeinsamen Datenstruktur durch die beiden Anwendungen,
  • sicherstellen, dass Änderungen, die von einer Anwendung vorgenommen werden, zuverlässig in den Hauptspeicher geschrieben und von der anderen gelesen werden,
  • Stellen Sie sicher, dass die Änderungen in der erwarteten Reihenfolge auf die Disc übertragen werden.

Ein Java-spezifisches Problem besteht darin, dass Sie Ihre Java-Objekte nicht in den Speicherbereich einfügen können. Stattdessen müssen Sie sie in einer Weise serialisieren und deserialisieren, die mit den Darstellungen kompatibel ist, die die C ++ - Seite erwartet.

Schließlich, selbst wenn es Ihnen gelingt, all diese Probleme zu lösen, ist Ihre Lösung wahrscheinlich fragil, weil sie vom unspezifizierten Verhalten der Betriebssystem-, C ++ - und Java-Implementierungen abhängt, die sich möglicherweise ändern können Sie ändern Versionen von jedem der oben genannten.

    
Stephen C 23.11.2010 23:39
quelle