Performance IO vs. NIO

Status
Nicht offen für weitere Antworten.
C

canndy

Gast
Hallo,

ich habe eine ziemlich große Datei (1 GB Flat File), die ich sequentiell analysieren möchte.

Nun habe ich durch Tests festgestellt, dass BufferedInputStream (aus io) und MappedByteBuffer (aus nio) so ungefähr die schnellsten Lösungen sind -- abgesehen von Direct Buffering. Beide Möglichkeiten sind für das sequentielle Lesen ungefähr gleich schnell:

Variante IO:

Code:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("TEST.CSV"));
while (bis.read() >= 0);

Variante NIO:

Code:
RandomAccessFile raf = new RandomAccessFile("TEST.CSV","r");
MappedByteBuffer mbb = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, raf.length());
while (mbb.hasRemaining()) mbb.get();

Was mich aber verwundert ist das Speicherverhalten dieser beiden Varianten. Im Windows Task-Manager benötigt Variante NIO teilweise 500 MB Speicher, während Variante IO mit 8 MB klarkommt.

Warum ist das so? Sollte man für sequentielles Lesen immer IO statt NIO verwenden?

canndy
 

Wildcard

Top Contributor
NIO ist schneller als IO, aber vielleicht mappst du ein wenig zu viel gleichzeitig in den RAM? :wink:
 
C

canndy

Gast
Hm, bis jetzt habe ich noch nirgends gesehen, dass das File aufgespaltet gemappt werden muss, damit es effizient ist. Ich habe es gerade mal geviertelt, und das Ergebnis war von der Zeit her sogar noch schlechter und vom Speicher her genauso wie vorher (sogar einmal bis zu 700 MB belegt). Was vermutlich daran liegt, dass der Garbage-Collector nicht läuft? Und wenn er laufen würde, würde dies ja auch das (zeitliche) Ergebnis wieder vermiesen, oder?

Also, zusammengefasst, beim sequentiellen Lesen hat bei mir MappedByteBuffer eine wesentlich schlechtere Performance bzgl. des Speichers als BufferedInputStream -- und von der Laufzeit her ungefähr gleich. Ich dachte immer, NIO wäre besser. ;-)
 
G

Guest

Gast
Datendurchsatz-Vergleich auf meinem System:

Variante IO: 40 MB/s

Variante NIO: 33 MB/s

"Direct Buffering": 60 MB/s

(Mit Direct Buffering meine ich folgende Art:)

Code:
byte[] buf = new byte[8192];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("TEST.CSV"));
while (bis.read(buf) >= 0);

Die HD-Benchmark-Software "HD Tach" sagt mir, dass 51 MB/s der durchschnittliche Datendurchsatz (Lesen) meiner Festplatte sind.

NIO scheint bei sequentiellem Lesen nur Nachteile zu bringen. Und dann gibt es anscheinend auch noch den Bug, dass man gemappte Dateien nicht mehr (deterministisch) löschen kann:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724038

Aber ich würde mich gerne eines Besseren belehren lassen.
 
G

Gast

Gast
Code:
byte[] buf = new byte[8192];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("TEST.CSV"));
while (bis.read(buf) >= 0);

ist das nicht irgendwie doppeltgemoppelt?

Der BufferedInputStream buffert ja schon, dann kann man doch auch direkt mit bis.read() einlesen (Wenn man denn byteweise durchgehen will)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
N Java-Performance messen Java Basics - Anfänger-Themen 1
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
P Priority Queue Performance Java Basics - Anfänger-Themen 3
P Performance Array und Liste Java Basics - Anfänger-Themen 13
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
E Hilfe zur Performance Verbesserung gesucht Java Basics - Anfänger-Themen 1
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
R Datei kopieren: Performance erhöhen Java Basics - Anfänger-Themen 10
S Wie performance lastig sind rekursionen Java Basics - Anfänger-Themen 13
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
J Softwaresynthesizer Performance? Java Basics - Anfänger-Themen 11
I Anzahl einer Liste (Performance) Java Basics - Anfänger-Themen 2
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
S Performance HashMap<=>Array Java Basics - Anfänger-Themen 17
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
S unterschied in performance Java Basics - Anfänger-Themen 4
hdi Worst-Performance-Award für Arbeiten mit ListModel Java Basics - Anfänger-Themen 7
hdi Performance Frage (Threads,Swing) Java Basics - Anfänger-Themen 4
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
G import .; - Speicherauslastung, Performance Java Basics - Anfänger-Themen 14
G Performance Java Basics - Anfänger-Themen 18
S dynamic arrays/ performance Java Basics - Anfänger-Themen 2
RaoulDuke Arbeitsweise / Speichernutzung / Performance Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben