Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сравнение 2-х TFileStream


Страницы:   1 2 3 4 5

Unknown1 ©   (2012-11-16 11:16:00) 

Как быстро сравнить?


Игорь Шевченко   (2012-11-16 15:48:00) [61]

RWolf ©   (16.11.12 15:33) [19]


> читать в буфер можно ведь и мимо кэша, не?


Можно. Но надо исхитряться. По умолчанию работа с файлами выполняется с использованием кэша.


DVM   (2012-11-16 15:45:00) [62]

Если отображенные в память файлы сравнивать просто CompareMem, то немного быстрее поблочного чтения, примерно на 25%.


DVM   (2012-11-16 15:42:00) [63]

Сравнил я.
При размере буфера 64к скорости сравнялись. До 64к сравнение отображенных в память было быстрее, чем по блокам. Но тут надо учитывать, что сравнивать все равно придет поблочно читая из отображенных в память файлов, т.к. натравливать на них CompareMem не очень практично, т.к. при больших файлах этот процесс нельзя будет прервать и в реальной жизни так не удобно.


RWolf   (2012-11-16 15:33:00) [64]


> Игорь Шевченко ©   (16.11.12 15:26) [17]

читать в буфер можно ведь и мимо кэша, не?


DVM   (2012-11-16 15:31:00) [65]


> Игорь Шевченко ©   (16.11.12 15:26) [17]


> Первым делом при чтении в кэш она их отображает в память
> нужными определенными порциями.

Если я буду читать такими же примерно порциями? Сомневаюсь, что будет сильный выигрыш.

Легко поставить эксперимент, кстати. Сейчас проверю.


Игорь Шевченко   (2012-11-16 15:26:00) [66]

DVM ©   (16.11.12 15:14) [16]

Почитай, как Windows работает с файлами. Первым делом при чтении в кэш она их отображает в память нужными определенными порциями.


DVM   (2012-11-16 15:14:00) [67]


> Игорь Шевченко ©   (16.11.12 15:11) [14]

Чтоб сравнить все равно потребуется чтение с диска, как б она с ним не работала.


DVM   (2012-11-16 15:14:00) [68]

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


Игорь Шевченко   (2012-11-16 15:11:00) [69]


> почему?


почитай как Windows работает с файлами


DVM   (2012-11-16 15:11:00) [70]


> Можно и иначе, без TFileStream и без поблочного чтения.
> Отображаешь файлы (memory mapping, используются ф-и API)
> в память

Не все можно отобразить в память. Адресное пространстов 32 бит программ невелико по меркам современных жестких дисков и например два видеофайла туда не отобразить больших.


DVM   (2012-11-16 15:09:00) [71]


class function TStreamHelper.CompareStreams(A, B: TStream;
 BufferSize: Integer = DefStreamBufferSize): Boolean;
var
 BufferA, BufferB: array of Byte;
 ByteCountA, ByteCountB: Longint;
begin
 SetLength(BufferA, BufferSize);
 try
   SetLength(BufferB, BufferSize);
   try
     repeat
       ByteCountA := A.Read(BufferA[0], BufferSize);
       ByteCountB := B.Read(BufferB[0], BufferSize);

       Result := (ByteCountA = ByteCountB);
       Result := Result and CompareMem(BufferA, BufferB, ByteCountA);
     until (ByteCountA <> BufferSize) or (ByteCountB <> BufferSize) or not Result;
   finally
     SetLength(BufferB, 0);
   end;
 finally
   SetLength(BufferA, 0);
 end;
end;


AV   (2012-11-16 15:01:00) [72]


> Игорь Шевченко ©   (16.11.12 13:52) [10]

почему?

Если файл большой, система скажет, что готово, отображено все. А потом, за кулисами, будет лазить в файл.

против

Зачитать в память все. Если не сбросит в своп - все в память.


Игорь Шевченко   (2012-11-16 13:52:00) [73]

RWolf ©   (16.11.12 13:41) [9]

Не выигрывает


RWolf   (2012-11-16 13:41:00) [74]

один мой знакомый, помнится, проводил бенчмарк на предмет быстрого подсчёта контрольной суммы больших файлов; у него получалось, что чтение в буфер выигрывает в плане скорости у отображения в память.


bems   (2012-11-16 13:26:00) [75]

С размером только на х32
А какие тут проблемы со скоростью?


QAZ9   (2012-11-16 12:50:00) [76]


> Можно и иначе

можно, но ненужно, ибо будут проблемы как со скоростью, так и с размером файлов


Dimka Maslov   (2012-11-16 12:00:00) [77]

MD5 высчитать для обоих файлов.


RWolf   (2012-11-16 11:53:00) [78]


> Amoeba_   (16.11.12 11:51) [4]

можно, но условием задачи было сравнение 2-х TFileStream.


Amoeba_   (2012-11-16 11:51:00) [79]


>  при совпадении прочитать данные поблочно да сравнить, а
> как ещё-то?

Можно и иначе, без TFileStream и без поблочного чтения. Отображаешь файлы (memory mapping, используются ф-и API) в память, и как для двух массивов байтов делаешь CompareMem.


AV   (2012-11-16 11:46:00) [80]

это первые 65536 байт только


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо