Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

05.05.2016, 22:55

Effizient Dateien vergleichen

Ich habe bei meinem Nebenjob die tolle Aufgabe bekommen, Dateien miteinander vergleichen. Bzw. wir müssen es, da wir bei Abrufen bei Drittanbietern ggf. die gleiche Datei mehrere Male bekommen können. Das i-Tüpfelchen dabei ist, dass es sich dabei meistens um nicht gerade kleine PDF's handelt. Hat jemand damit Erfahrung und weiß vllt. einen effizienten Weg? Ich dachte daran, die Dateien Chunk-Weise einzulesen und dann Byte-Weise zu vergleichen. Dann spare ich mir zumindest einen Riesen-Batzen Speicher, da ich immer nur einen Chunk von, sagen wir, 4096 Bytes habe, dessen Speicher ich ja auch wiederverwenden kann.
Allerdings haben wir festgestellt, dass PDF's mindestens zwei Stellen haben, an denen sie sich immer unterscheiden: Die Meta-Informationen von \Creation-Date und \ID die noch dazu (meines Erachtens jedenfalls) irgendwie mitten in der Datei stehen. Deswegen ist der Quick-and-Dirty Weg zur Zeit, die komplette Datei einzulesen, die besagten Stellen mittels eine Regex zu ermitteln und zu eliminieren und dann den Rest zu vergleichen. Leider fällt mir derzeit auch keine wirklich bessere Idee ein. Hat jemand einen klugen Ansatz?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

05.05.2016, 22:59

Ich würde mir für jede Datei einen Hash ausrechnen, erstmal nur die Hashes vergleichen und nur wenn die Hashes gleich sind die Dateien byteweise vergleichen...

3

05.05.2016, 23:02

Dann kann auch gleich alles verglichen werden, schließlich muss beim hashen auch durch alles durchiteriert werden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

05.05.2016, 23:06

Aber nur einmal pro Datei; wenn du jede Datei mit jeder vergleichen willst, musst du so jede Datei n mal durchiterieren, anstatt jede nur einmal und dann nur die Hashes vergleichen... ;)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

05.05.2016, 23:06

Richtig. Ich kann mich leider auch nicht auf Dateinamen oder sonstiges verlassen. Deswegen war die Chunk-Idee die einzige die mir in den Sinn kam, das ganze halbwegs effizient gestalten zu können.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

6

05.05.2016, 23:12

Das stimmt natürlich, das mit den hashen.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

05.05.2016, 23:14

Ich würde mir für jede Datei einen Hash ausrechnen, erstmal nur die Hashes vergleichen und nur wenn die Hashes gleich sind die Dateien byteweise vergleichen...

Verstehe nicht ganz, warum nur wenn die Hashes gleich sind? Nicht eher wenn sie ungleich sind?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

05.05.2016, 23:33

Wenn die Hashes ungleich sind, dann sind die Dateien definitiv unterschiedlich.
Wenn die Hashes hingegen gleich sind, dann könntest du eine Kollision haben. Auch wenn die unwahrscheinlich ist.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

06.05.2016, 00:01

Auf was für einer Infrastruktur läuft das Ganze? Windows/Unix? Wie groß ist groß? Wieviele Dateien pro welchem Zeitintervall? Wie zeitkritisch? Welcher Grad von Automatisierung (wird der Prozess von Menschen angestoßen)? Wie schlimm sind Dopplungen (false negatives)?

Warum ich diese Fragen stelle ist, um erstmal festzustellen wieviel Aufwand überhaupt sinnvoll ist. Natürlich kann man es beliebig kompliziert machen, aber ggf ist ja das DIFF tool von (Tortoise)GIT vollkommend ausreichend. Auch stellt sich die Frage, ob man wirklich im Falle von hashing auf Kollisionen achten muss.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

06.05.2016, 00:17

Zielplattform ist Ubuntu, bei der Größe reden wir von 100 KB bis 10 MB. Es kommen bis zu 100 Dateien als Attachement in einem Abruf, welcher nur wenige Sekunden dauert (1 - 3 sec. ca). Das Verarbeiten und abspeichern wird automatisch vollzogen, der gesamte Abruf wird per Cronjob angestoßen. Momentan werden alle 60 min. Anfragen getätigt, wobei pro Anfrage zwischen 0 .. 100 Abrufe geliefert werden, jeder Abruf mit bis zu 100 Dateien als Attachement. Bald soll as Zeitinvertval auf 10 min. runtergesetzt werden. Dopplungen sind soweit es möglich ist zu vermeiden.
Das mit dem Git-Diff-Tool ist eig. 'ne gute Idee, danke. Das werde ich mal antesten. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige