Hallo,
immer wieder hat mich verwundert, wieviel die Puffergröße beim Kopieren von Dateien von einer lokalen Festplatte auf eine andere lokale Festplatte ausmacht.
Ich meine jetzt nicht, dass es Vorteile bringt statt 128 byte Puffer einen 8192 byte Puffer zu benutzen. Ich meine, dass es (jenachdem welche Festplatten man hat!!) massive Unterschiede macht, ob man 32kb, 64kb oder vlt sogar 128kb benutzt.
Mein Problem ist, dass ich iwie das Gefühl hab, dass es da kein Patentrezept gibt, sondern es stark auf die Festplatte ankommt, die man benutzt.
Ich habe da ein paar Daten die bei einer recht gründlichen Testreihe entstanden sind:
Szenario:
900mb Datei auf Laufwerk C -> Kopieren auf Laufwerk D (Beides sind physikalische Laufwerke, beide SATA-II)
Die Laufwerke haben etwa eine Leistung um die 90-95 MB pro Sekunde. HD Tune hat diese Werte geliefert,
simples Kopieren mit Windows bestätigt dies.
Der Code:
1. Versuch (8192 Byte Puffer): zwischen 55 - 60 mb/s
2. Versuch (64*1024 Byte Puffer): zwischen 93-96 mb/s !!! (Sehr guter Wert!)
3. Versuch (128*1024 Byte Puffer): zwischen 20-70 mb/s (Schwankte stark, Durchschnitt war ebenfalls 55-60 wie beim 1. Versuch)
So, erst dachte ich "Gut, immer 64*1024" verwenden. Beim Testen auf einem anderen Computer, der sehr viel älter war und noch IDE Festplatten hatte, erreichte ich statt 35mb/s (Das war das Höchste, was dort HD Tune ermittelte) mit 64*1024 nur noch um die 18-20 mb/s. Dort waren 8192 Byte Puffer der Bringer.
Was habt ihr dabei für Erfahrungen ? Mir ist das Problem schon öfter mal aufgefallen, aber da ich nie riesige Dateien kopieren musste in meinen vorherigen Projekten, spielte das nur eine untergeordnete Rolle (mehr aus Interesse).
Gibt es eine Möglichkeit die ideale Puffergröße zu ermitteln ?
Meine Theorie dabei ist, dass Festplatten eine bestimmte Datenmenge effektiver lesen können, als andere Größen. Das z.B. beim Lesen von 128*1024 statt 64*1024 meine SATA Festplatten effezienter arbeiten. Aber ist nur eine Theorie.
Meine nächste Idee wäre mal, diese ganze Sache mal mit asynchronen FileChannels aus dem JDK7 zu probieren, diese können alle I/O-Operationen asynchron ausführen, bei Windows z.B. sind das die Completion Ports, die ein Event senden, wenn ein gewisser Vorgang fertig ist. Damit könnte man z.B. auf die 2. Festplatte Daten schreiben, während von der ersten Festplatte bereits Daten gelesen werden. Ich könnte mir vorstellen, dass man damit bestimmt bessere Geschwindigkeiten erzielen kann!
Also, was meint ihr zu diesem Thema ? Ist irgendwem das schonmal aufgefallen ? Liegt das vlt an schlecht fragmentierten Dateien ? Wobei ich mein System grad erst neu aufgesetzt hab und eigentlich sowas nicht zu erwarten ist...
Danke schonmal
Gruß,
Chris
immer wieder hat mich verwundert, wieviel die Puffergröße beim Kopieren von Dateien von einer lokalen Festplatte auf eine andere lokale Festplatte ausmacht.
Ich meine jetzt nicht, dass es Vorteile bringt statt 128 byte Puffer einen 8192 byte Puffer zu benutzen. Ich meine, dass es (jenachdem welche Festplatten man hat!!) massive Unterschiede macht, ob man 32kb, 64kb oder vlt sogar 128kb benutzt.
Mein Problem ist, dass ich iwie das Gefühl hab, dass es da kein Patentrezept gibt, sondern es stark auf die Festplatte ankommt, die man benutzt.
Ich habe da ein paar Daten die bei einer recht gründlichen Testreihe entstanden sind:
Szenario:
900mb Datei auf Laufwerk C -> Kopieren auf Laufwerk D (Beides sind physikalische Laufwerke, beide SATA-II)
Die Laufwerke haben etwa eine Leistung um die 90-95 MB pro Sekunde. HD Tune hat diese Werte geliefert,
simples Kopieren mit Windows bestätigt dies.
Der Code:
Java:
String file1 = "C:/test.ogg";
String file2 = "D:/test.ogg";
FileChannel input = new FileInputStream(file1).getChannel();
FileChannel output = new FileOutputStream(file2).getChannel();
ProgressFuture progress = new ProgressFuture(input.size());
progress.addListener(new ProgressFutureListener() {
public void operationUpdated(ProgressFuture future) throws Throwable {
if (future.getLatestRateClock().getTimeValue(TimeUnit.Seconds) >= 1) {
System.out.println(future.getLatestRate(TimeUnit.Seconds));
}
}
public void operationDone(ProgressFuture future) throws Throwable {
}
});
ByteBuffer buffer = ByteBuffer.allocateDirect("Einer der Werte, die gleich beschrieben werden");
while (!progress.isDone()) {
int amount = input.read(buffer);
buffer.flip();
output.write(buffer);
buffer.clear();
progress.update(amount);
}
1. Versuch (8192 Byte Puffer): zwischen 55 - 60 mb/s
2. Versuch (64*1024 Byte Puffer): zwischen 93-96 mb/s !!! (Sehr guter Wert!)
3. Versuch (128*1024 Byte Puffer): zwischen 20-70 mb/s (Schwankte stark, Durchschnitt war ebenfalls 55-60 wie beim 1. Versuch)
So, erst dachte ich "Gut, immer 64*1024" verwenden. Beim Testen auf einem anderen Computer, der sehr viel älter war und noch IDE Festplatten hatte, erreichte ich statt 35mb/s (Das war das Höchste, was dort HD Tune ermittelte) mit 64*1024 nur noch um die 18-20 mb/s. Dort waren 8192 Byte Puffer der Bringer.
Was habt ihr dabei für Erfahrungen ? Mir ist das Problem schon öfter mal aufgefallen, aber da ich nie riesige Dateien kopieren musste in meinen vorherigen Projekten, spielte das nur eine untergeordnete Rolle (mehr aus Interesse).
Gibt es eine Möglichkeit die ideale Puffergröße zu ermitteln ?
Meine Theorie dabei ist, dass Festplatten eine bestimmte Datenmenge effektiver lesen können, als andere Größen. Das z.B. beim Lesen von 128*1024 statt 64*1024 meine SATA Festplatten effezienter arbeiten. Aber ist nur eine Theorie.
Meine nächste Idee wäre mal, diese ganze Sache mal mit asynchronen FileChannels aus dem JDK7 zu probieren, diese können alle I/O-Operationen asynchron ausführen, bei Windows z.B. sind das die Completion Ports, die ein Event senden, wenn ein gewisser Vorgang fertig ist. Damit könnte man z.B. auf die 2. Festplatte Daten schreiben, während von der ersten Festplatte bereits Daten gelesen werden. Ich könnte mir vorstellen, dass man damit bestimmt bessere Geschwindigkeiten erzielen kann!
Also, was meint ihr zu diesem Thema ? Ist irgendwem das schonmal aufgefallen ? Liegt das vlt an schlecht fragmentierten Dateien ? Wobei ich mein System grad erst neu aufgesetzt hab und eigentlich sowas nicht zu erwarten ist...
Danke schonmal
Gruß,
Chris