tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
731
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von celph_titled
    celph_titled celph_titled ist offline Mitglied Gold
    Registriert seit
    May 2007
    Beiträge
    107
    Hallo zusammen,

    vielleicht hat jemand eine Idee hierzu:

    Ich hab mir ein Programm gebastelt, dass mir quasi ein Backup eines Verzeichnisses erstellt, aber nicht komprimiert sondern eine genaue Kopie. Da sich im Quellverzeichnis immer nur wenig verändert will ich nicht bei jedem Durchlauf alles neu rüberkopieren sondern nur das was sich verändert hat, also praktisch ein inkrementelles Backup. Wenn eine Datei sowohl im Quell- als auch im Zielverzeichnis vorhanden ist muss ich die ja vergleichen. Dazu hab ich die CRC-Checksumme aus java.util.zip eingebaut, aber bei 9 GB in ungefähr 2000 Dateien dauert das schon ne Weile. Ich weiß nicht ob das die optimale Lösung ist
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    private long getChecksum(File f) {
        try {
            CRC32 c = new CRC32();
            byte b[] = new byte[1024];
            FileInputStream in = new FileInputStream(f);
            int len = 0;
            while((len=in.read(b))>=0) {
                c.update(b,0,len);
            }
            in.close();
            return c.getValue();
        }
        catch(Exception e) {
            return -1;
        }
    }
    Die Funktion wird jeweils für die Quell- und die Zieldatei aufgerufen. Die Dateien sind so zwischen 600kB und 5MB groß.
    Gibt es ne Möglichkeit das zu beschleunigen? Die Puffergröße zu ändern bringt leider kaum was. Die Adler-Checksumme soll ja schneller sein, aber auch unzuverlässig. Ist das so oder kann ich die schon benutzen?
    Oder weiß jemand sonst eine Möglichkeit die Dateien schneller zu vergleichen?

    Danke im Voraus
     

  2. #2
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Die Checksummen der gesicherten Dateien würde ich nicht jedes Mal nue berechnen lassen, sondern in einer Datenbank sichern, somit sparst du dir schon mal einiges. (Datenbankabfrage ist wesentlich schneller erledigt, als die Berechnung einer Prüfsumme).

    Eventuell kannst du dir den Checksummen-Algorithmus anschauen und gucken, ob sich dieser beschleunigen lässt. Außerdem wäre es möglich, dass du nicht über die gesamte Datei eine checksumme berechnest, sondern nur über deren Attribute wie Größe und letztes Änderungsdatum.
     

  3. #3
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Man kann auch statt einer DB schlicht ein gewöhnliches Text-File oder wenn man mag auch ein Properties-File zum Speichern der Checksummen verwenden, das ist Geschmacksache.
    Ich würde vielleicht auch vor einer Checksummen-Berechnung die Länge der Datei anschauen und vergleichen und nur bei gleichstand auf eine Checksumme zurückgreifen.
     

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Wenn man eine Datei verändert, wird die doch dann nicht mitgesichert?!
    Da er ja nur die Checksum der alten Datei in der DB hat, und das Backup die selbe hat.

    Von der Adler habe ich noch nie was gehört, aber unter "unzuverlässig" würde ich Kollisionen und nicht Fehler im Vergleich verstehen.
    Geändert von Kai008 (09.04.09 um 16:31 Uhr)
     

  5. #5
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Wenn ich mir den Anwendungsfall nochmal so anschaue, bin ich mir nicht so sicher ob eine Checksumme hier eigetnlich notwendig ist. Klassisch verwendet man doch eigetnlich dann Checksummen, wenn man feststellen möchte, dass eine Datei nicht korupt ist, die man vielleicht gerade übertragen/runtergeladen hat.
    In diesem Fall geth es einzig um die Frage ist die Datei identisch mit der alten. Das kann man neben vorabchecken der Dateilänge dann auch IMHO bequem über byteweisen vergleich tun, bis man einen Unterschied bemerkt. Auf diese weise müsste man weder die eine noch die andere Datei von vorn bis ganz nach hinten lesen, sondern hätte, Im Falle eines Unterschiedes viel schneller diesen bemerkt.

    Also ich würde auf Checksummen hier vermutlich sogar ganz verzichten, wenn es lediglich um inkrementelles Backup geht.
     

  6. #6
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Byteweise Dateivergleiche sind doch wesentlich teurer (ständiges Umpositionieren der Leseköpfe), als das Berechnen einer Checksumme und der Vergleich mit einer archivierten Checksumme.

    Eventuell wäre ein 2-stufiges System praktikabel, das zuerst anhand einfacher Kriterien (Dateilänge, Änderungsdatum, Permission-Flags) die Gleichheit überprüft und die Checksumme erst dann zu Hilfe nimmt, wenn die Dateien im ersten Schritt als gleich eingestuft wurden.
     

  7. #7
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Als kleine Idee:
    Ich würde mir überlegen vielleicht einfach den lastmodified Zeitstempel der Datei als Vergleich zu nehmen.
    Klar vielleicht wurde die Datei nur angefasst, aber nichts daran geändert, aber vielleicht ist das in deinem Fall der einfachste Weg.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  8. #8
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Zitat Zitat von procurve Beitrag anzeigen
    Byteweise Dateivergleiche sind doch wesentlich teurer (ständiges Umpositionieren der Leseköpfe), als das Berechnen einer Checksumme und der Vergleich mit einer archivierten Checksumme.
    Naja ich meinte mit dem Byteweisen Vergleich nicht, dass da ungepuffert die DAteien gelesen werden sollen
    Ich denke mal es hängt auch schwer von der Datei ab u.U. sogar vom Dateityp. Wurde vorrangig vorne geändert, würde der Vergleich sehr schnell sein. Würde vorrangig hinten geändert dauert es erheblich länger. Hat man einen Dateityp, der vielleicht in sich soetwas ähnliches wie eine Checksumme schon beherbergt, das dann glücklicherweise ganz oben steht, hat man super gewonnen.
    Für den ganz allgemeinen Fall, kann ich mir vorstellen, dass bei einem direkten Vergleich (spekulativ) statistisch die Hälfte von beiden Dateien gelesen werden müsste. Das entspräche dann von den gelesenen Daten dann spekulativ statistisch gesehen wenn man eine Datei von vorne nach hinten liest, also ungefär dem selben Aufwand wie mit der Checksumme, die man zwischenspeichert für die eine eventuell neue Dateiversion. Abgesehen von dem Schreiblesekopfwechsel, der bei entsprechenden Puffer nicht ganz so häufig auftreten sollte und ebenfalls abgesehen von der Zeit die benötigt wird eine Checksumme zu errechnen, käme dass vielleicht ganz gut aufs selbe raus.
    Aber wie schon mehrfach gesagt ist es sinnvoll länge der Dateien vorher zu prüfen.
    vom Datum und von Berechtigungen würde ich, wenn es "nur" um Inhalt geht absehen.
    Geändert von takidoso (20.04.09 um 14:53 Uhr)
     

Ähnliche Themen

  1. Problem mit Checksumme
    Von chickenwings im Forum Java
    Antworten: 1
    Letzter Beitrag: 25.05.10, 10:37
  2. checksumme der imei errechnen
    Von nico_arndt im Forum PHP
    Antworten: 2
    Letzter Beitrag: 08.09.06, 15:42
  3. CRC32 Checksumme errechnen
    Von jokey2 im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 16.12.05, 01:26
  4. CRC Checksumme
    Von Konsumierer im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 29.04.05, 11:55
  5. Checksumme errechnen
    Von Sneaker im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 08.01.03, 15:05