Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Процентное соотношение


Автор: Antony41 19.12.2009, 01:51
Всем привет!
Хотелось бы узнать как можно сравнить два файла (по байтам) и сделать вывод, на сколько процентов один файл совпал с другим...
Хотя бы с чего начинать?
Как это можно организовать с потоками? и тот же вопрос, если файл больших размеров, 2,3,5 гб?

Примерно прикинул, думаю что нужно куда то писать, совпавшие байты, и не совпавшие, а потом посчитать и далее по формуле...?

Автор: Демо 19.12.2009, 02:10
Проблема в том, чтобы прочитать файл? Или в чём?

Автор: ~FoX~ 19.12.2009, 02:23
А файлы какого то формата или просто набор битов? А файлы одинаковые по размеру или может быть ситуация при которой первый фал размером в гиг может полностью включать в себя файл размером в пол гига? 
Файлы размером больше 2 гиг придется резать... Тяжело адресовать смещение на 2^31

Автор: Antony41 19.12.2009, 02:27
Проблема в том, куда записывать совпавшие байты и не совпавшие

Добавлено @ 02:35
Файлы любого формата, независимо, файлы могут быть разным размером, да может быть и такое что пол гига и гиг.
Ну я думаю можно обойтись и без резания, мне кажется что для сравнения, можно будет использовать до двух тоесть если первый файл будет размером 3 гб, а второй 5, то я думаю сравнить 2 гига вполне хватит, а остальное просто отрубить)))

Основная проблема в том, что придётся сравнивать большое количество файлов, например до 7 - 8 тыс. то есть если например в списке будет 7000 файлов, то эту процедуру придётся выполнять 24 496 500 раз.

Автор: ~FoX~ 19.12.2009, 03:02
Antony41, Не очень понятно, есть файл с содержимым - 0123 и есть файл - 123 если сравнить их побитово то совпадений не будет... Чтобы узнать совпадения нужно сравнивать какой то средний показатель... Например представить файл в битовой маски и сравнивать спектр участка, или использовать вейлветы или другой какой нибудь критерий.... С коэффициентами... Копать нужно в сторону алгоритмов сжатия и оптимизированного статистического анализа... Иначе анализ 7000 файлов с возможностями присутствия в каждом из каждых последовательностей превращается в задачу по распределенным вычислениям и займет оооочень много времени...

Автор: Antony41 19.12.2009, 03:32
Вот и я всё это понимаю, но теоретически то это возможно... Сейчас буду думать
Цитата

представить файл в битовой маски и сравнивать спектр участка, или использовать вейлветы или другой какой нибудь критерий.... С коэффициентами...

Работаю сейчас с таким алгоритмом, он в принципе работает нормально, но иногда его можно и обмануть))
Спасибо Fox сейчас буду что нибудь думать. Еще отпишусь в этом разделе...

Автор: Antony41 19.12.2009, 08:36
в принципе всё ясно! пытался, но толком ни чего не вышло использую пока функцию не точного сравнения участков
примерно так
Код

var
  F1,F2:TFileStream;
  i:longint;
  CutZone, FOutPos:LongInt;
  Buff1,Buff2:PByteArray;
  tmpFtrPos:integer;
  FStrSub, FStrBuff1:String;
begin
{...}
      GetMem(Buff1,tmpFTRPOS);
      GetMem(Buff2,tmpFTRPOS);

      CutZone:=F1.Size-F2.Size;
      F1.Position:=Trunc((f1.Size-CutZone)/2);
      FOutPos:=F1.Size-CutZone-F1.Position;
      F2.Seek(-FOutPos, soFromEnd);

      if tmpFTRPOS>FOutPos then
        tmpFTRPOS:=FOutPos;
      F1.Read(Buff1^,tmpFTRPOS);
      F2.Read(Buff2^,tmpFTRPOS);

      for I := 0 to tmpFTRPOS do
        FStrBuff1:=FStrBuff1+IntToStr(Buff1^[i]);
      for I := Trunc(tmpFTRPOS/3) to tmpFTRPOS-Trunc(tmpFTRPOS/3) do
        FStrSub:=FStrSub+IntToStr(Buff2^[i]);

      if AnsiPos(FStrSub, FStrBuff1)<>0 then
        Result:=True;

      F1.Free;
      F2.Free;
      FreeMem(Buff1,tmpFTRPOS);
      FreeMem(Buff2,tmpFTRPOS);
{...}
end;


Как можно ускорить эту функцию?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)