[Java]Dateien kopieren, Threads und Multicore Umgebungen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Milbret
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

Beitrag von Milbret » 19.06.2009 22:45:52

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen

Beitrag von rendegast » 20.06.2009 03:48:21

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.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Milbret
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

Beitrag von Milbret » 20.06.2009 09:01:52

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

michaels
Beiträge: 1164
Registriert: 29.03.2009 18:12:25

Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen

Beitrag von michaels » 20.06.2009 10:44:14

Hallo,
Wäre es Vorteilhaft wenn man dafür entweder Threads oder Multicore Unterstützung nutzen würde?
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..
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?
Ja, das wäre natürlich auch möglich.

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

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen

Beitrag von rendegast » 20.06.2009 11:35:58

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.
Ich wollte das pragmatisch sehen.
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")

Milbret
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

Beitrag von Milbret » 29.06.2009 20:42:04

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

michaels
Beiträge: 1164
Registriert: 29.03.2009 18:12:25

Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen

Beitrag von michaels » 29.06.2009 21:18:21

Hallo,

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);
	        }
wäre:

Code: Alles auswählen

    int length;
    byte[] buffer = new byte[8192];

    while ( ( length = in.read( buffer ) ) != -1 ) {

      out.write(buffer, 0, length);

    }
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...

Milbret
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

Beitrag von Milbret » 29.06.2009 22:04:54

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

Milbret
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

Beitrag von Milbret » 11.07.2009 11:25:23

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

Benutzeravatar
ruwen
Beiträge: 389
Registriert: 06.04.2003 18:37:25

Re: [Java]Dateien kopieren, Threads und Multicore Umgebungen

Beitrag von ruwen » 11.07.2009 15:55:00

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 )

Benutzeravatar
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

Beitrag von Lord_Carlos » 11.07.2009 17:31:57

Ich habe einen sha1 und md5 hash code hier gefunden: http://www.componentworkshop.com/blog/2 ... -and-ruby/

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;
}
Geht bei mir ganz wunderbar und auch relativ fix SHA

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Milbret
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

Beitrag von Milbret » 11.07.2009 20:03:07

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
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

Benutzeravatar
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

Beitrag von Lord_Carlos » 12.07.2009 04:01:48

Ich _glaube_ das getestet zu haben .. aber warum teste du das nicht einfach kurz mal selber?

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Milbret
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

Beitrag von Milbret » 12.07.2009 10:33:20

Auch wahr ^^
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 :D

Antworten