der Schnellste Weg zum erstellen von Prüfsummen für große Dateien in python
brauche ich, um die übertragung großer Dateien über das Netzwerk und benötigen zum erstellen der Prüfsumme für Sie auf Stundenbasis. also ist die Geschwindigkeit für die Erzeugung der Prüfsumme ist für mich sehr wichtig.
irgendwie kann ich nicht machen, zlib.crc32 und zlib.adler32 arbeiten mit Dateien größer als 4GB auf Windows XP Pro 64bit Maschine. ich vermute, dass ich getroffen habe, die 32bit-Beschränkung hier? mit hashlib.md5, konnte ich ein Ergebnis bekommen aber das problem ist die Geschwindigkeit. es dauert etwa 5 Minuten zum generieren eines md5 für 4,8 GB file. task-manager zeigt, dass der Prozess nutzt nur einen core.
meine Fragen sind:
- ist es ein Weg, um crc-Werke auf der großen Datei? ich bevorzuge die crc als md5 -
- wenn nicht, dann ist es ein Weg, um die Geschwindigkeit der md5.hexdigest()/md5.verdauen? oder in diesem Fall jede hashlib hexdigest/verdauen? vielleicht spliting es in multi-thread-Prozess? wie mache ich das?
PS: ich arbeite somethimg ähnlich wie ein "Asset Management" - system, eine Art, wie svn aber der Vermögenswert bestehen aus großen komprimierte image-Dateien. die Dateien klein wenig inkrementelle änderungen. die Hash/Prüfsumme ist erforderlich für die Erkennung von änderungen und Fehler Erkennung.
Brauchen Sie, Ihre Integrität zu überprüfen (mit dem entsprechenden Algorithmus, ist die eigentliche Frage) nur weil Sie die übertragung der Dateien über das Netzwerk? Wenn ja, ist dies bereits bestätigt auf der hardware-Ebene für den Rahmen und die Tcp-Schicht für jedes fehlende Teil (ich gehe davon aus, dass eine Tcp-Verbindung hier). Sorry, wenn das klingt einleuchtend, aber ich würde lieber Fragen.
hi Jungs, danke für die Antwort. warum kann ich nicht verwenden, rsync, weil das ist ja fast wie ein asset-management-system, das die übertragung großer komprimierte image-Dateien. mehrere Personen arbeiten auf einige Dateien. diese Dateien klein wenig inkrementelle änderungen, die nötig ist, um erkannt zu werden. daher bin ich versucht zu verwenden, checksum/hash.
InformationsquelleAutor pixelblender | 2009-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Auswahl von algorithmen problem, anstatt eine Bibliothek/language-Auswahl problem!
Scheint es zwei Punkte zu berücksichtigen, vor allem:
Offenbar die Antwort auf die zweite Frage, ist so etwas wie " einige falsch-negative erlaubt", da die Zuverlässigkeit der alle 32-bit-hash-Werte, die relativ zu einer 4-GB-Botschaft, auch in einer mäßig lauten Kanal, dann ist das nicht nahezu absolut.
Vorausgesetzt, dass die I/O verbessert werden kann durch multithreading, so können wir wählen eine hash nicht erforderlich ist, ist ein sequentieller scan der gesamten Nachricht. Stattdessen können wir vielleicht arbeiten die Datei parallel, hashing einzelnen Abschnitte und entweder die Kombination der hash-Werte oder anfügen, um eine längere, zuverlässige Fehlererkennung Gerät.
Der nächste Schritt könnte sein, zu formalisieren dieses handling der Dateien, die als geordnete Abschnitte, und übertragen Sie Sie als solche (neu-verklebt, auf der Empfängerseite). Dieser Ansatz, zusammen zusätzliche Informationen über die Art und Weise der Dateien erzeugt (für ex. Sie können ausschließlich geändert von Anhängen, wie log-Dateien), kann sogar erlauben, begrenzen Sie die Menge der hash-Berechnung erforderlich. Die Komplexität dieses Ansatzes muss gewichteten gegen den Wunsch zu haben, zippy schnelle CRC-Berechnung.
Seite Hinweis: Alder32 ist nicht beschränkt auf message-Größen, die unter einem bestimmten Schwellenwert. Es kann nur eine Begrenzung der zlib-API. (BTW, der Hinweis, den ich gefunden über zlib.adler32 verwendet einen Puffer, und naja... dieser Ansatz ist zu vermeiden, im Rahmen unserer riesigen Nachrichten, zugunsten von Streaming-Prozesse: ein wenig Lesen aus Datei, berechnen, wiederholen..)
Ja, vorausgesetzt, dass die I/O sind nicht ein Flaschenhals, ein multi-threaded-Implementierung Prozess würde sagen 100 Mb bytes "Stücke" der Datei, im parallel Mode kann erwartet werden, werden insgesamt schneller als ein single-threaded-Ansatz. Sie müssen zu Experimentieren, um zu bestimmen, die optimale Anzahl von threads (es kommt immer ein Punkt, wo hinzufügen thread führt nicht zu einer Verbesserung der Leistung). Die geordnete Liste von Prüfsummen von den einzelnen "Scheiben" der kann entweder CRC-ed selbst, oder, preferabbly CRCs angefügt werden können, bilden eine größere Tasten für eine bessere Fehlererkennung.
InformationsquelleAutor mjv
Erste, es gibt nichts inhärent in jeder der CRC-algorithmen, die es verhindern, dass Sie arbeiten auf einer beliebigen Länge der Daten (für einen bestimmten Implementierung können auch beschränkt).
Jedoch in einer Datei-Synchronisierung Anwendung, dass das wohl egal ist, wie Sie vielleicht nicht wollen Hashwert der gesamten Datei, wenn es wird groß, nur Stücke sowieso. Wenn Sie Hashwert der gesamten Datei, und die hashes an jedem Ende unterscheiden, müssen Sie kopieren die gesamte Datei. Wenn Sie hash behoben, große Stücke, dann müssen Sie nur kopieren Sie die Stücke, deren hash geändert hat. Wenn die meisten änderungen an den Dateien lokalisiert sind (z.B. Datenbank), dann wird dies wahrscheinlich benötigen viel weniger kopieren (und es ist einfacher zu verbreiten pro chunk Berechnungen auf mehrere Kerne).
Als für den hash-Algorithmus selbst, der grundlegende Nachteil ist die Geschwindigkeit vs. fehlen von Kollisionen (zwei verschiedene Daten-chunks, woraus sich die gleichen hash). CRC-32 ist schnell, aber mit nur 2^32 einzigartige Werte-Kollisionen gesehen werden kann. MD5 ist viel langsamer, aber hat 2^128 eindeutige Werte, so dass Kollisionen wird fast nie gesehen (aber noch theoretisch möglich ist). Die größeren hashes (SHA1, SHA256, ...) haben noch mehr eindeutige Werte, sind aber langsamer noch: ich bezweifle, dass Sie Sie brauchen: Sie machen sich sorgen über unbeabsichtigte Kollisionen, im Gegensatz zu digitale Signatur-Anwendungen, wo Sie sind besorgt über bewusst (malicously) entwickelt Kollisionen.
Es klingt wie Sie versuchen zu tun etwas sehr ähnlich zu dem, was der rsync-Dienstprogramm. Können Sie nur verwenden rsync?
Auch wenn Sie nicht finden können, einen geeigneten Python-Implementierung des CRC32-Algorithmus, sollten Sie in der Lage sein, passen eine Umsetzung veröffentlicht in jeder Sprache. Sie könnte sogar die Nutzung von Python-Funktionen zu verknüpfen, um native code-Bibliotheken. Dies könnte auch helfen, die Geschwindigkeit (aber Ihre Leistung ist wahrscheinlich begrenzt durch die Festplatten-I/O sowieso mit CRC-32). Die CRC-algorithmen sind relativ einfach. Ich habe implementierten CRC-8 und CRC-16 in ein paar Zeilen C und einem statischen Daten-Tabelle. Ich kann mich nicht erinnern, Implementierung von CRC-32, aber ich bin mir ziemlich sicher, dass es nicht viel komplizierter.
InformationsquelleAutor Stephen C. Steel
Könnten Sie schlagen einen Grenzwert für die Größe von Dateien in XP. Die 64-bit-Version gibt Ihnen mehr addressing space (entfernen der 2GB (oder so) Adressierung Speicherplatz pro Anwendung), aber wahrscheinlich tut nichts für die Größe der Datei problem.
InformationsquelleAutor Calyth
Können Sie möglicherweise mit mehr als einem Kern zu berechnen MD5-hash einer großen Datei aufgrund der Natur von MD5: Sie erwartet eine Nachricht, um gebrochen zu werden, bis Sie in Stücke und verfüttert Sie in Hash-Funktion in der strengen Reihenfolge. Sie können jedoch die Verwendung eines Threads zu Lesen, eine Datei in die interne Warteschlange, und dann berechnen hash in einem separaten thread, so dass. Ich nicht, denke aber, dass Sie alle signifikanten performance-Schub.
Die Tatsache, dass es so lange dauert, zu verarbeiten, eine große Datei könnte durch "unbuffered" liest. Versuchen Sie zu Lesen, sagen wir, 16 Kb in einer Zeit, und dann füttern Sie den Inhalt in Blöcken zu Hash-Funktion.
InformationsquelleAutor Anton Gogolev
md5 selbst können nicht parallel ausgeführt werden. Allerdings können Sie die md5-Datei in Sektionen (parallel) und die nehmen einen md5 von der Liste der Hash-Werte.
Jedoch davon ausgegangen, dass die Vermischung ist nicht IO-beschränkt, die ich vermuten würde, dass Sie es ist. Als Anton Gogolev schlägt vor, - stellen Sie sicher, dass Sie Lesen die Datei effizient (in großen power-of-2 chunks). Sobald Sie das getan haben, stellen Sie sicher, dass die Datei nicht fragmentiert.
Auch ein hash wie z.B. sha256 ausgewählt werden sollten, sondern als md5 für neue Projekte.
Sind die zlib-Prüfsummen viel schneller als md5 für die 4Gb Dateien?
danke für die Antwort Douglas. ich denke, sha256 ist ein bisschen zu viel für mich und die Kollision ist nicht wirklich ein Problem für mich.
InformationsquelleAutor Douglas Leeder
Haben Sie versucht, das crc-generator Modul?
InformationsquelleAutor Brian