Przyspieszenie procedury sprawdzania plików

0

Witam,
Mam taka procedure do sprawdzania MD5:

procedure Tform1.CheckMD5();
var
  SomeTxtFile : TextFile;
  buffer, md5filename, md5var, SrvMD5 : string;
  Line : TStringList;
begin
  AssignFile(SomeTxtFile, './file.list') ;
  Reset(SomeTxtFile) ;
  while not EOF(SomeTxtFile) do
  begin
   ReadLn(SomeTxtFile, buffer) ;
   Line := TStringList.Create;
   Line.CommaText := buffer;
   SrvMD5 := AnsiUpperCase(Line[1]);
   md5filename := Line[0];
   md5var := FileMD5(md5filename);
  CompareStrings(md5var, SrvMD5, Line[0]);
  end;
  CloseFile(SomeTxtFile) ;
end;

Wszystko jest ok i działa, tylko jak można byłoby to przyspieszyć? jak zrobić z tego np. wielowątkowość? lub jakieś inne elementy które przyspieszą sprawdzanie plików.

0

po co ten stringlist? posex, copy zamiast niego. nigdzie nie robisz line.free, więc gubisz mnóstwo pamięci.
"./" - linix? przecież i tak czytasz plik z bieżącego katalogu, na co to.

wątki niewiele pomogą, głównym ograniczeniem jest szybkość odczytu z dysku, poza tym plik tekstowy ma dostęp sekwencyjny, więc nie możesz jednym wątkiem czytać od początku, a drugim od środka.

wydajniejsze będzie czytanie nie z tekstowego po linijce, tylko z typowanego albo ze streamu. wtedy możesz czytać od dowolnego miejsca, wiec możesz spróbować podzielić na wątki (imho będzie bardzo mały zysk - sekwencyjny - maksymalnie szybko - odczyt z dysku to około 100MB/s, MD5 spokojnie tyle przełknie; dwa wątki czytajace naraz to skoki głowicy i spadek szybkości). wadą rozwiązania jest to, że sam musisz parsować zawartość odczytanego bufora z danymi i robić z niego stringa czy co tam potrzebujesz. ale jest to jak najbardziej do zrobienia, w serwisie gdzieś siedzi mój program do binarnego wyszukiwania w posortowanym pliku tekstowym.

[dopisane]
zresztą mniejsza z tym (poza fatalnym gubieniem pamięci). źle przeczytałem: to jest źródło powolności: FileMD5(md5filename);. to zżera pewnie z 99% czasu wykonywania całej pętli. nie przyspieszysz.

0

tego się obawiałem ze nie da się zrobić wątków :/ no trudno
dzięki za info.

0

możesz podzielić to na wątki kiedy chociaż jeden plik leży na innym dysku (fizycznym, nie na innej partycji).

pozbądź się wycieku pamięci.

0

Podstawowa sprawa - waskie gardlo tworzy odczyt z pliku SomeTxtFile, bo jest sekwencyjny. Powinien zostac wykonany raz (do jakiejs struktury danych), a potem kazdy z plikow, dla ktorego jest liczony md5 mozna przetwarzac rownolegle.

W tym momencie wychodzi mozliwosc optymalizacji, na przyklad zadbania, by pliki z jednego dysku fizycznego lecialy sekwencyjnie, ale z roznych dyskow rownolegle. Jak dojdzie jeszcze do tego fakt, ze jedna partycja moze lezec na kilku dyskach (RAID 0 software'owy jest przeciez wbudowany w Windows), sprawa wymaga wiecej przemyslenia niz tylko dzielenie wszystkiego na rownolegle watki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1