Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
ВнизСинхронизатор: проблема быстрой проверки большого кол-ва файлов Найти похожие ветки
← →
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 fileshFile := 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.061 c