[Java]Dateien kopieren, Threads und Multicore Umgebungen
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
[Java]Dateien kopieren, Threads und Multicore Umgebungen
Hallo liebe Debianer,
ich bastle gerade an einem Java Tool mit dem ich, ähnlich wie rsync nur eben ohne Netzwerksupport, meine Daten synchron halte.
Aktuell läuft dies auch schon sehr gut wenn auch noch nicht ganz perfekt in der Umsetzung aller Ideen.
Da ich das Kopieren etwas beschleunigen würde, hätte ich ein paar Fragen.
Wäre es Vorteilhaft wenn man dafür entweder Threads oder Multicore Unterstützung nutzen würde?
Mit Threads könnte ich doch theoretisch es so machen, dass ich einzelnen Threads die Aufgabe gebe Dateien im Quellverzeichnis mit dem Zielverzeichnis abzugleichen oder?
Wäre Klasse wenn mir jemand in dem Bereich Tipps geben könnte.
Ich kopiere im Moment über 50GB Daten und dies dauert aktuell bei geschafften 28 GB rund 3-4 Stunden was sehr lange ist.
Martin
ich bastle gerade an einem Java Tool mit dem ich, ähnlich wie rsync nur eben ohne Netzwerksupport, meine Daten synchron halte.
Aktuell läuft dies auch schon sehr gut wenn auch noch nicht ganz perfekt in der Umsetzung aller Ideen.
Da ich das Kopieren etwas beschleunigen würde, hätte ich ein paar Fragen.
Wäre es Vorteilhaft wenn man dafür entweder Threads oder Multicore Unterstützung nutzen würde?
Mit Threads könnte ich doch theoretisch es so machen, dass ich einzelnen Threads die Aufgabe gebe Dateien im Quellverzeichnis mit dem Zielverzeichnis abzugleichen oder?
Wäre Klasse wenn mir jemand in dem Bereich Tipps geben könnte.
Ich kopiere im Moment über 50GB Daten und dies dauert aktuell bei geschafften 28 GB rund 3-4 Stunden was sehr lange ist.
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
28.000MB / 12.000s = 2,5 MB/s
DMA abgeschaltet?
Externe Festplatte USB2 = 25 MB/s
Und für einem älteren Rechner noch eine USB2-Karte ~ 10 Euro.
DMA abgeschaltet?
Externe Festplatte USB2 = 25 MB/s
Und für einem älteren Rechner noch eine USB2-Karte ~ 10 Euro.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Ich muss dazu sagen, dass ich je ein MB einlese und danach auch gleich schreibe.
Dies erklärt die geringe Geschwindigkeit.
Aber trotzdem löst es nicht meine Frage.
Martin
Dies erklärt die geringe Geschwindigkeit.
Aber trotzdem löst es nicht meine Frage.
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Hallo,
Wie machst du es denn jetzt? Durchläufst du das Quellverzeichnis und kopierst die Daten gleich? Suchst du dir erstmal alle Dateien, die sich verändert haben? .....
Zeig mir mal bitte den Code-Schnipsel, wo du die Dateien kopierst...
Gruß
Michael
Hm, das macht die Verwaltung der Threads und das Fehlerhandling immer komplizierter. Um Multicore Unterstützung müsstest du dir dann aber keine Sorgen machen, da das alles die JVM für dich übernimmt. Du müsstest also nur mehrere Threads starten und die werden dann automatisch von der JVM verteilt..Wäre es Vorteilhaft wenn man dafür entweder Threads oder Multicore Unterstützung nutzen würde?
Ja, das wäre natürlich auch möglich.Mit Threads könnte ich doch theoretisch es so machen, dass ich einzelnen Threads die Aufgabe gebe Dateien im Quellverzeichnis mit dem Zielverzeichnis abzugleichen oder?
Wie machst du es denn jetzt? Durchläufst du das Quellverzeichnis und kopierst die Daten gleich? Suchst du dir erstmal alle Dateien, die sich verändert haben? .....
Zeig mir mal bitte den Code-Schnipsel, wo du die Dateien kopierst...
Gruß
Michael
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Ich wollte das pragmatisch sehen.Milbret hat geschrieben:Ich muss dazu sagen, dass ich je ein MB einlese und danach auch gleich schreibe.
Dies erklärt die geringe Geschwindigkeit.
Aber trotzdem löst es nicht meine Frage.
In der Zeit, in der Deine Lösung läuft,
habe ich mit meinem Vorschlag die Daten 5-mal komplett kopiert und per md5 überprüft.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Hallo,
aktuell mache ich das ganze nur über die File Klasse.
Dort prüfe ich einfach per length die Größe in Byte.
Den Code kannst du dir dort anschauen -> http://martinm.ma.funpic.de/java/jsync/
Dort liegt atm nicht ganz die aktuelle Version
Sollte aber reichen.
Das Problem mit der Geschwindigkeit habe ich auch etwas trickie gelöst.
So kann man per config eine buffer Größe angeben.
Diese kann zwischen 1 Byte und 102,4 Megabyte liegen.
Natürlich ist das ganze noch ziemlich unsicher da der Buffer noch zu einem Heap Overflow führen kann.
Muss das nochmal überdenken wie man das gut umsetzen kann.
Ansonsten wäre ich für etwas mehr Performance dankbar
Vielleicht kannst du mir da etwas helfen
Martin
aktuell mache ich das ganze nur über die File Klasse.
Dort prüfe ich einfach per length die Größe in Byte.
Den Code kannst du dir dort anschauen -> http://martinm.ma.funpic.de/java/jsync/
Dort liegt atm nicht ganz die aktuelle Version
Sollte aber reichen.
Das Problem mit der Geschwindigkeit habe ich auch etwas trickie gelöst.
So kann man per config eine buffer Größe angeben.
Diese kann zwischen 1 Byte und 102,4 Megabyte liegen.
Natürlich ist das ganze noch ziemlich unsicher da der Buffer noch zu einem Heap Overflow führen kann.
Muss das nochmal überdenken wie man das gut umsetzen kann.
Ansonsten wäre ich für etwas mehr Performance dankbar
Vielleicht kannst du mir da etwas helfen
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Hallo,
habs gerade mal gesucht und gefunden.
Eigentlich ist das so schon Ok, auch wenn deine while Schleife etwas "unsauber" ist. Schöner als:
wäre:
Deine Dateien sind wahrscheinlich ziemlich klein, oder?
Hab gerade mal einen Test bei mir mit einer 2GB Datei gemacht.
Das gibt mein Testprogramm aus:
Daten: 2074 MB
Zeit: 30 s
Geschwindigkeit: 69 MB/s
Also schon recht fix.
Ich werde mir deinen Code mal etwas genauer anschauen...
habs gerade mal gesucht und gefunden.
Eigentlich ist das so schon Ok, auch wenn deine while Schleife etwas "unsauber" ist. Schöner als:
Code: Alles auswählen
while(true)
{
byte[] buffer = new byte[size];
read = in.read(buffer);
if (read == -1)
{
//-1 bedeutet EOF
break;
}
//out.write(buffer, 0, read);
out.write(buffer, 0 ,read);
}
Code: Alles auswählen
int length;
byte[] buffer = new byte[8192];
while ( ( length = in.read( buffer ) ) != -1 ) {
out.write(buffer, 0, length);
}
Hab gerade mal einen Test bei mir mit einer 2GB Datei gemacht.
Das gibt mein Testprogramm aus:
Daten: 2074 MB
Zeit: 30 s
Geschwindigkeit: 69 MB/s
Also schon recht fix.
Ich werde mir deinen Code mal etwas genauer anschauen...
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Das ist schon einmal gut wenn der eigentliche Kopiercode schon ganz gut ist.
Bin leider aus der C++ und C# Region und da war die Einarbeitung in die Java Klassen nicht so einfach.
Aber dank einigen Dutzend Anleitungen aus dem Netz ist es schon ganz gut voran gegangen.
Ich werde die Schleife in den kommenden Tagen mal anpassen, da ich mit dem Code von mir auch noch nicht so ganz zufrieden bin.
Martin
Bin leider aus der C++ und C# Region und da war die Einarbeitung in die Java Klassen nicht so einfach.
Aber dank einigen Dutzend Anleitungen aus dem Netz ist es schon ganz gut voran gegangen.
Ich werde die Schleife in den kommenden Tagen mal anpassen, da ich mit dem Code von mir auch noch nicht so ganz zufrieden bin.
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Hallo,
hab ein kleines Problem.
Ich will nun MD5 und SHA1 als Hashes verwenden.
Leider scheint meine MD5 Testimplementierung nicht zu stimmen
Hier der Code:
http://nopaste.debianforum.de/22923
Bei dem Programm md5sum bekomme ich einen anderen Wert als mit diesem Code.
Leider gibt es im Netz keine perfekte Anleitung die ich nutzen könnte
Martin
hab ein kleines Problem.
Ich will nun MD5 und SHA1 als Hashes verwenden.
Leider scheint meine MD5 Testimplementierung nicht zu stimmen
Hier der Code:
http://nopaste.debianforum.de/22923
Bei dem Programm md5sum bekomme ich einen anderen Wert als mit diesem Code.
Leider gibt es im Netz keine perfekte Anleitung die ich nutzen könnte
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Falls du mit Threads arbeiten möchtest (könnte Performance-Vorteile bringen in meinen Augen), empfehle ich dir mit ThreadPools zu arbeiten, damit nicht soviel Aufwand für das Erzeugen der Threads draufgeht.
MD5 gibts doch schon fertig (sowohl von Haus aus als auch von anderen: http://www.twmacinta.com/myjava/fast_md5.php )
MD5 gibts doch schon fertig (sowohl von Haus aus als auch von anderen: http://www.twmacinta.com/myjava/fast_md5.php )
- Lord_Carlos
- Beiträge: 5578
- Registriert: 30.04.2006 17:58:52
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Dänemark
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Ich habe einen sha1 und md5 hash code hier gefunden: http://www.componentworkshop.com/blog/2 ... -and-ruby/
Geht bei mir ganz wunderbar und auch relativ fix SHA
Code: Alles auswählen
public static String generateHash(File file) throws NoSuchAlgorithmException, FileNotFoundException, IOException
{
MessageDigest md = MessageDigest.getInstance("SHA"); // SHA or MD5
String hash = "";
byte[] data = new byte[(int)file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(data);
fis.close();
md.update(data); // Reads it all at one go. Might be better to chunk it.
byte[] digest = md.digest();
for (int i = 0; i < digest.length; i++)
{
String hex = Integer.toHexString(digest[i]);
if (hex.length() == 1) hex = "0" + hex;
hex = hex.substring(hex.length() - 2);
hash += hex;
}
return hash;
}
Code: Alles auswählen
╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Okay aber ich habe Zweifel, dass diese Methode auch gut funktioniert wenn ich eine 4,4 GB iso Datei habe und diese dann in den Speicher lese der nur 2 GB umfasst
Ansonsten scheint es gut zu sein.
Martin
Ansonsten scheint es gut zu sein.
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
- Lord_Carlos
- Beiträge: 5578
- Registriert: 30.04.2006 17:58:52
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Dänemark
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Ich _glaube_ das getestet zu haben .. aber warum teste du das nicht einfach kurz mal selber?
Code: Alles auswählen
╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!
-
- Beiträge: 827
- Registriert: 26.05.2008 12:04:54
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Nörten-Hardenberg
-
Kontaktdaten:
Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen
Auch wahr ^^
Ich teste es gleich mal
Wenn es knallt melde ich mich ^^
Nachtrag:
Klappt super
Danke ^^
Martin
Ich teste es gleich mal
Wenn es knallt melde ich mich ^^
Nachtrag:
Klappt super
Danke ^^
Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever