Müssen wir MappedByteBuffer.force () verwenden, um Daten auf die Festplatte zu schreiben?

9

Ich verwende MappedByteBuffer, um Dateilese- / schreibvorgänge zu beschleunigen (). Meine Fragen wie folgt:

  1. Ich bin mir nicht sicher, ob ich die .force () -Methode verwenden muss, um den Inhalt auf die Festplatte zu schreiben oder nicht. Es sieht so aus, als ob ohne .force () die .getInt () immer noch perfekt funktionieren könnte (naja, da dies ein Speicher-gemappter Puffer ist, nehme ich an, dass .getInt () die Daten von der Platte holt, was bedeutet, dass die Daten in die Datenbank übertragen wurden Festplatte bereits.

  2. Ist die .force () -Methode eine Blockierungsmethode?

  3. Ist eine Blockierungsmethode ein synchronisierter Block?

  4. Es gibt einen enormen Leistungsunterschied mit oder ohne Aufruf der .force () -Methode. Was nützt es, .force () manuell aufzurufen? Unter welcher Situation sollten wir es verwenden? Ich gehe davon aus, dass die Daten immer noch auf die Festplatte hinter der Szene geschrieben werden, ohne sie aufzurufen.

  5. Wenn wir .force () aufrufen müssen, hilft das Aufrufen eines anderen Threads, die Leistung zu verbessern? Wird es die Daten aufgrund von Synchronisationsproblemen korrumpieren?

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode;

öffentliche Klasse Main {

%Vor%

}

    
janetsmith 04.11.2010, 12:58
quelle

4 Antworten

3
  1. Sie sollten es nur aufrufen, wenn Sie extreme Transaktionsanforderungen haben, d. h. Sie implementieren eine Datenbank. getInt () liest aus dem Speicher: Das Betriebssystem blendet die Datei in diesen Speicher ein und aus.

  2. Es ist nicht angegeben.

  3. Methoden werden synchronisiert, wenn dies angegeben ist. Es hat nichts damit zu tun, ob sie blockieren oder nicht.

  4. Siehe (1). Die Daten werden immer noch geschrieben, aber nur vom Betriebssystem und nicht von Ihnen.

  5. Ich bezweifle es, aber siehe (2), und ich bezweifle, dass Sie es überhaupt nennen müssen, siehe (1).

EJP 04.11.2010, 13:09
quelle
3

MappedByteBuffer.force () ist in Windows nicht nutzlos. Ich habe das Tool "Process Monitor" von Ссылка verwendet, um den Dateizugriff zu überwachen. Entsprechend der Protokollierung ruft MappedByteBuffer.force () sofort Windows API WriteFile () im Nicht zwischengespeicherten synchronen Modus auf. Die Zuverlässigkeit sollte ähnlich wie FileChannel.force () sein, die Windows API FlushFileBuffers () sofort aufrufen wird, um eine Datei zu schreiben. Daher ist MappedByteBuffer.force () für die meisten Arten von Verwendungen zuverlässig genug. Getestet auf Windows 7 64bit mit Java 1.6.0_24.

    
Yao 08.07.2011 02:34
quelle
2

OK, nehmen Sie meine Antwort mit einer Prise Salz (ich bin kein NIO-Experte)

1.) Der putInt(i, i) schreibt in den MappedByteBuffer (mbb), der sich im Speicher befindet, und das Betriebssystem überträgt diesen Wert bei Bedarf in die tatsächlich zugrunde liegende Datei ( test.map ).

Die Verwendung von force() veranlasst das Betriebssystem, die Daten 'jetzt' zu übertragen (was nützlich sein kann, wenn Sie einen anderen Prozess haben, der aus dieser Datei lesen muss).

Ihr getInt(i) liest den Wert aus dem MappedByteBuffer (mbb), wenn Sie force() in der Weise verwenden, wie Sie es sind, dann wissen Sie, dass Ihre Datei im Hintergrund mit diesem Speicherpuffer synchronisiert ist).

Wahrscheinlich müssen Sie force()

nicht verwenden

2.) Nicht sicher, denke ich es ist, wie das Java 7 NIO.2-Zeug darauf anspielt, in der Lage zu sein, solche Dinge in einer nicht-blockierenden Weise zu tun. Ich recherchiere das momentan noch.

3.) Dies sind zwei getrennte Anliegen. Ich würde empfehlen, sich Doug Leas Buch anzusehen: -).

4.) Wie 1.) sagt, sagt force () dem Betriebssystem, 'jetzt' zu schreiben, sonst schreibt das Betriebssystem, wenn es sich anfühlt.

    
Martijn Verburg 04.11.2010 13:36
quelle
1

Ссылка

force () ist unter Windows nutzlos. Ziemlich gruselig Bug.

    
Thommy 28.12.2010 21:55
quelle