Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

Синхронизатор: проблема быстрой проверки большого кол-ва файлов   Найти похожие ветки 

 
kukuikar ©   (2007-05-16 07:51) [0]

На данном этапе программа работает. Но выплыла проблема проверки идентичности файлов.

Прога рекурсивно проходит указанные папки для копирования, исключает файлы по расширению. Вообщем-то простоение списка копируемых файлов занимает не так много времени. Занимает много времени проверка идентичности 2-х файлов. Я проверяю дату последнего изменения файла и если дата изменена то копирую его.

Все нормально работает при объеме до 6 Гб, файлы весят от 20Кб до 200 Мб.

Мастера, как посоветуете быстро проверять 2 файла на одинаковость?

Заранее спасибо.


 
Elen ©   (2007-05-16 08:13) [1]


>  Я проверяю дату последнего изменения файла и если дата
> изменена то копирую его.

Я делаю так : Организовываю две базы, одна предидущая другая новая (сегодняшняя). Далее простым запросом получаю список измененных файлов и уже их обрабатываю.


 
Loginov Dmitry ©   (2007-05-16 09:04) [2]

> Мастера, как посоветуете быстро проверять 2 файла на одинаковость?


Так и проверяй - по дате и размеру файла. А чтобы быстро проверка работала - оптимизируй алгоритм. Вообще подобным образом сравнение 500 файлов должно занимать не более 0.5 сек.


 
clickmaker ©   (2007-05-16 09:40) [3]


> как посоветуете быстро проверять 2 файла на одинаковость?

чтоб уж наверняка - считай контрольную сумму. CRC32


 
kukuikar ©   (2007-05-16 10:02) [4]


> чтоб уж наверняка - считай контрольную сумму. CRC32

Пробовал.
Для файлов больших размеров долго очень считается CRC32


 
clickmaker ©   (2007-05-16 10:08) [5]


> долго очень считается CRC32

ну там тоже есть простор для оптимизации
memory mapped files, к примеру


 
Anatoly Podgoretsky ©   (2007-05-16 11:53) [6]


> Для файлов больших размеров долго очень считается CRC32

А ты оптимально читаешь файлы? Может ты по байтам работаешь?
Сделай более простой подсчет, например N := N + F(I) и тип Integer


 
Leonid Troyanovsky ©   (2007-05-16 15:09) [7]


> clickmaker ©   (16.05.07 09:40) [3]

> > как посоветуете быстро проверять 2 файла на одинаковость?

> чтоб уж наверняка - считай контрольную сумму. CRC32

Чтобы наверняка, то нужно сравнивать сами файлы.
Т.е., читаем в буферы, сравниваем два буфера и т.д.
Любые хеш-функции здесь только лишние.

--
Regards, LVT.


 
kukuikar ©   (2007-05-16 15:34) [8]

Кстати я не сказал. Все это дело сбрасывается на сервер в локалке. Скорости хватает,гигабитная сеть.
С оптимизацией проверки разобрались. Буду сравнивать так:


function TfrmMain.CompareFileDates(const FirstFile, SecondFile: string): Boolean;
begin
Result := GetFileDate(FirstFile) = GetFileDate(SecondFile);
end;

function TfrmMain.GetFileDate(FileName: string): Integer;
var
 FHandle: Integer;
begin
 FHandle := FileOpen(FileName, fmShareDenyNone);
 try
   Result := FileGetDate(FHandle);
 finally
   FileClose(FHandle);
 end;
end;


А как насчет копирования, я копирую так:


function CallBackfnsForCopyFileEx(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: large_integer; DWStreamNumber, DWCallbackReason: Dword; HSourceFile, HDestinationFile: THandle; LpData: Pointer): Dword; stdcall;
begin
if DWCallbackReason = Callback_Stream_Switch then
 TGauge(LpData).MaxValue := TotalFileSize.QuadPart;
TGauge(LpData).Progress := TotalBytesTransferred.QuadPart;
Application.ProcessMessages;
Result := Progress_Continue;
end;

function TfrmMain.CopyWithProgress(SSource, SDest: String): Boolean;
begin
Result := CopyFileEx(PChar(SSource), PChar(SDest), @CallBackfnsForCopyFileEx, frmProgress.pf, nil, 0);
end;


Что скажете?


> Anatoly Podgoretsky ©   (16.05.07 11:53) [6]

Непонял, а поподробнее немного можно?


 
Anatoly Podgoretsky ©   (2007-05-16 16:46) [9]

> kukuikar  (16.05.2007 15:34:08)  [8]

Вроде все нормально.
А по поводу более подробно, нет нужды считать CRC достаточно считать только контрольную СУММУ, но это тоже не оптимально, более оптимально просто сравнивать по 4 байта (с учетом конца) и прекращать при первом несравнении, может быть гигантский выигрыш по скорости, например при несравнение первых 4 байт, нет нужды читать остальные 200 мегабайт. Тоже тебе советовал Леонид Трояновский и при этом никаких коллизий.


 
kukuikar ©   (2007-05-16 17:07) [10]


> Anatoly Podgoretsky ©   (16.05.07 16:46) [9]

Спасибо. Буду оптимизироваться дальше :)


 
kukuikar ©   (2007-05-16 21:09) [11]

Побайтово так:?


var
 F1, F2: file;
 B1, B2: array[0..1023] of Char;
 i1, i2: Integer;

repeat
   BlockRead(F1, B1, SizeOf(B1), i1);
   BlockRead(F2, B2, SizeOf(B2), i2);
   if B1 <> B2 then
   begin
     CloseFile(F1);
     CloseFile(F2);
     Exit;
   end;
 until EoF(F2);


 
clickmaker ©   (2007-05-17 09:29) [12]


> [11] kukuikar ©   (16.05.07 21:09)

CompareMem()

и рекомендую memory mapped files

hFile := CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
                   nil, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
dwSize1 := GetFileSize(hFile1, NULL);
dwSize2 := GetFileSize(hFile2, NULL);
if (dwSize1 = dwSize2) then begin
 hMapping1 := CreateFileMapping(hFile1, nil, PAGE_READONLY, 0, 0, nil);
 ну и т.д.



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
15-1182353896
Тохер
2007-06-20 19:38
2007.07.22
Распознование картинки. Как?


15-1182329521
Суслик
2007-06-20 12:52
2007.07.22
Коллекции рисунков на tool button ы


15-1178181667
Steep
2007-05-03 12:41
2007.07.22
Как отговорить ставить линуксы?


15-1182770012
DrAndrew
2007-06-25 15:13
2007.07.22
Как записать значение языка в ini файл при инсталляции Inno Setup


1-1179320420
Alexys
2007-05-16 17:00
2007.07.22
списки