Re: Eindeutiger Vergleich für große Dateien gesucht
ups. fehler.
|
Re: Eindeutiger Vergleich für große Dateien gesucht
Moin,
ich führe noch vor dem vollständigen Scan einen schnellen Scan durch. Dabei lese ich die ersten 2 KB ein und bilde wiederum eine Prüfsumme, kommt es zu doppelten Summen überrpüfe ich die gesamte Datei. |
Re: Eindeutiger Vergleich für große Dateien gesucht
hallo,
ja, das ist klar. allerdings prüfst du doch die komplette datei, indem du von der kompletten datei eine checksumme erstellst. aber wie hier in diesem thread ja festgestellt wurde, ist das nicht 100%ig eindeutig. oder ist es schon zu spät für mich? |
Re: Eindeutiger Vergleich für große Dateien gesucht
moin,
auch der komplette Scan stellt nicht sicher, das die Dateien identisch sind. :zwinker: |
Re: Eindeutiger Vergleich für große Dateien gesucht
ja, genau das meine ich doch.
also prüfst du in deinem programm nicht byte per byte, oder? |
Re: Eindeutiger Vergleich für große Dateien gesucht
Byte für Byte md5, eine andere Methode habe ich noch nicht eingebaut,
bin noch am optimieren. |
Re: Eindeutiger Vergleich für große Dateien gesucht
ok, dann habe ich es verstanden. mich hätte nur die geschwindigkeit bei einer byte-per-byte analyse gewundert. bei mir rotieren da die festplatten köpfe, und bei deinem programm war er in einem bruchteil der zeit damit fertig.
|
Re: Eindeutiger Vergleich für große Dateien gesucht
Sind denn die Ergebnisse identisch oder gab es dabei abweichungen?
|
Re: Eindeutiger Vergleich für große Dateien gesucht
du meinst bei meinen tests nehme ich an?
naja, kann ich so nicht sagen, da ich nur diese eine datei kopiert und wieder eingefügt habe (ich habe leider nicht sonderlich viele dateien größer 1 gb auf meinem rechner liegen). der test ist also nicht aussagekräftig. ich wollte halt für den fall der fälle (kollision) doch einen byte-per-byte vergleich einbauen. der startet (ähnlich wie bei dir) erst, wenn dateigröße und md5 hash gleich sind. |
Re: Eindeutiger Vergleich für große Dateien gesucht
@dahead:
Zitat:
Suche mal nach "Memmory Mapped Files" und benutze diese neuere Technik des OS. FileStreams sind schön und gut haben aber den Nachteil das sie auf eienr "älteren" Schnittstelle zum Datenträger basieren. Ich habe mit MMF's die ich readonly und in partitionen erzeuge bessere Performance erzielt.
Delphi-Quellcode:
die obige quick&dirty Klasse kann als Ersatz für deinen Filestream dienen. Da sie von TCustomMemoryStream abgeleitet wurde kannst du über .Memory und .Size direkt per CompareMem() zwei Dateien vergleichen oder eben eine Hashfunktion drüberrutschen lassen.
type
TMMF = class(TCustomMemoryStream) // readonly Memory Mapped File private FHandle: THandle; FMapping: THandle; public constructor Create(const FileName: String); destructor Destroy; override; function Write(const Buffer; Count: Longint): Longint; override; end; constructor TMMF.Create(const FileName: String); var P: Pointer; S: Integer; begin FHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite); if FHandle > 0 then begin S := GetFileSize(FHandle, nil); if S > 0 then begin FMapping := CreateFileMapping(FHandle, nil, PAGE_READONLY, 0, 0, nil); if FMapping <> 0 then begin P := MapViewOfFile(FMapping, FILE_MAP_READ, 0, 0, 0); if P <> nil then inherited SetPointer(P, S); end; end; end; inherited Create; end; destructor TMMF.Destroy; begin if Memory <> nil then UnmapViewOfFile(Memory); if FMapping <> 0 then CloseHandle(FMapping); if FHandle <> 0 then CloseHandle(FHandle); inherited Destroy; end; function TMMF.Write(const Buffer; Count: Longint): Longint; begin Result := 0; // we should raise a exception here, but useloss end; Wie gesagt sie ist aber Quick&Dirty und man müsste noch einige Kleinigkeiten verbessern. Für deine ersten Versuche zum Vergleich der Performance zu TFileStream dürfte es aber reichen. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz