Ist es möglich, ein speicherbares Dateiobjekt in Java zu erstellen?

8

Eines der Optimierungsprojekte, an denen ich gerade arbeite, verwendet EPANet . Wir rufen in EPANet wiederholt zu zwei Simulationsmethoden auf, um zu verstehen, wie Wasser durch ein Wasserverteilungsnetz fließt.

HydraulicSim ist eine der Klassen, die wir nutzen. Siehe die überladenen simulate Methoden:

%Vor%

Die andere Klasse, die wir verwenden, ist QualitySim . Hier verwenden wir auch die überladenen simulate Methoden:

%Vor%

Folgendes machen wir gerade:

  1. Erstellen Sie zwei File -Objekte, hydFile und qualFile .
  2. Rufen Sie HydraulicSim.simulate auf hydFile .
  3. auf
  4. Rufen Sie QualitySim.simulate für hydFile und qualFile .
  5. auf
  6. Löschen Sie die Dateien.

Das Problem ist, dass wir das oft tun müssen. Bei einem großen Problem können wir dies Hunderttausende oder sogar Millionen Male tun. Sie können sich vorstellen, dass die Verlangsamung das Erstellen / Schreiben / Löschen dieser Dateien immer wieder verursacht.

Also meine Frage ist: Ist es mir möglich, diese Dateien so zu erstellen, dass sie nur im Speicher liegen und niemals die Festplatte berühren? Jede Datei ist sehr klein (ich spreche ein paar hundert Bytes), also ist es kein Problem, sie in den Speicher zu werfen; Ich muss nur herausfinden, wie. Ich suchte herum und fand nicht wirklich viel, außer für MappedByteBuffer , aber ich bin mir nicht sicher, wie oder wenn es überhaupt möglich ist, ein File aus dieser Klasse zu erstellen.

Jeder Rat ist willkommen!

    
Geoff 10.03.2014, 17:46
quelle

4 Antworten

2

Es könnte sich lohnen, ein Problem an das EPANet-Team zu richten. Die Simulationsmethoden verwenden einfach die Dateiobjekte, um Eingabe- und Ausgabeströme zu erhalten. Wenn sie eine QualitySim.simulate -Methode bereitstellen, die die Streams als Parameter verwendet (was sie für den Ausgabestream aber nicht für den Eingabestream tun), könnten Sie den FS umgehen. Oder mach es einfach und mach es selbst.

    
Mike B 11.03.2014, 16:28
quelle
6

Die einfachste Lösung besteht darin, die Ramdisk zu mounten und die Datei hier zu speichern. Dann müssen Sie Ihren Code nicht berühren und der Dateizugriff wird blitzschnell sein :-)

Linux

%Vor%

MacOS

  1. Ссылка

Windows

  1. Ссылка
  2. Ссылка
Leos Literak 10.03.2014 17:51
quelle
3

Sie können Memory mapped file verwenden. Java stellt APIs in FileChannel Class zur Verfügung, z. B.

%Vor%

Java bietet nur einen 32-Bit-Zeiger, um MappedByteBuffer zu bearbeiten, aber Sie können das Slicing verwenden, um mehr als 2 GB an Dateien zuzuordnen, z. B.

%Vor%     
Trying 10.03.2014 18:09
quelle
2

Es könnte zu viel werden, aber Java 7 bietet eine Möglichkeit, benutzerdefinierte Dateisysteme zu erstellen:

Ссылка

Sie können dies verwenden, um ein eigenes Dateisystem im Speicher zu erstellen, das von einer Map oder byte [] s unterstützt wird. Es scheint jedoch, dass das Dateisystem das neue Path -Objekt verwendet, nicht ein File (obwohl es Methoden gibt, in / aus Dateien zu konvertieren)

Könnte aber für das, was du versuchst, ein Overkill sein.

    
dkatzel 10.03.2014 18:00
quelle

Tags und Links