powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
25 сообщений из 112, страница 4 из 5
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575721
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicСледующий вариант обязательно будет с Memory !..)))
Готов вариант на TMemoryStream ...
Вот его код (все та же процедура с одним циклом, чтением и сравнением из двух файлов):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;

FMOriginal: TMemoryStream;
FMPereveden: TMemoryStream;

begin
     try
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;   // Эти файлы -
          FullPerevedenFileName := FileBinPerevedenEdit.Text; // уже проверялись
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FMOriginal := TMemoryStream.Create;
          FMPereveden := TMemoryStream.Create;
          FMOriginal.LoadFromFile(FullOriginalFileName);
          FMPereveden.LoadFromFile(FullPerevedenFileName);
          SizeOriginal := FMOriginal.Size;
          SizePereveden := FMPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;

          AddressFiles := 0;
          StartTime := Now;        // Фиксируем время Старта

          //===== Встали на Начало в Обоих файлах =====
          //FMOriginal.Seek(AddressFiles, soFromBeginning);
          //FMPereveden.Seek(AddressFiles, soFromBeginning);

          while AddressFiles <= SizeOriginal-1 do
               begin
                    FMOriginal.ReadBuffer(ISimvol, 1);
                    FMPereveden.ReadBuffer(PSimvol, 1);
                    Inc(AddressFiles);
                    // Ищем совпадение Нулевых байт
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              //
                         end;
               end;
     finally
          FMOriginal.Free;
          FMPereveden.Free;
          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "MemoryStream" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Полученное время цикла - 2,15 секунды!..)))
Отличный результат, и без доп.библиотек!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575765
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очередной вариант на основе TBytes ...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;
i: integer;

BOriginal: TBytes;
BPereveden: TBytes;

begin
     try
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;   // Эти файлы -
          FullPerevedenFileName := FileBinPerevedenEdit.Text; // уже проверялись
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FOriginal := TFileStream.Create(FullOriginalFileName, fmOpenRead, fmShareDenyNone);
          FPereveden := TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmShareDenyNone);
          SizeOriginal := FOriginal.Size;
          SizePereveden := FPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;
          
          // Определяем длину массивов TBytes
          SetLength(BOriginal, SizeOriginal);
          SetLength(BPereveden, SizePereveden);

          // Читаем Оба файла в TBytes
          FOriginal.ReadBuffer(BOriginal, SizeOriginal);
          FPereveden.ReadBuffer(BPereveden, SizePereveden);

          AddressFiles := 0;
          StartTime := Now;        // Фиксируем время Старта

          //===== Встали на Начало в Обоих файлах =====
          i := 0;

          while AddressFiles <= SizeOriginal-1 do
               begin
                    ISimvol := BOriginal[i];
                    PSimvol := BPereveden[i];
                    Inc(i);
                    Inc(AddressFiles);
                    // Ищем совпадение Нулевых байт
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              //
                         end;
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;
          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "MemoryStream" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Полученное время цикла - 0,08 секунды!!!!
Это пожалуй Рекордсмен!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575788
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic 0,08 секунды!!!!Ну вот, наконец реальное время.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575848
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicПолученное время цикла - 0,08 секунды!!!!
Это пожалуй Рекордсменmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575924
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

mmf не быстрее
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575973
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов
Ну вот, приплыли!...
Хотел было уже перейти к некоторым "внутренностям" Реальной процедуры, ака например "SStroka := SStroka + AnsiChar(ISimvol);" и прочим, но тут явился vavan и потребовал справедливости!...

Отвечу:
1 . Вот мне кажется именно с " MMF " будет как раз таки больше возни!?
2 . Не совсем этот " MMF " и его Поинтеры мне нравятся, в силу моих слабых знаний!...(

Ну что ж, MMF так MMF... Попробую, но не фак, что справлюсь!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575974
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUmmf не быстрееесли даже и так то в дидактических целях увлеченному может оказаться интересно
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575975
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicтут явился vavan и потребовал справедливостия не настаиваю, прошу прощения
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576005
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanя не настаиваю, прошу прощения
Сейчас будешь исправлят!!!..))))))
(Пардон за фамильярность!)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576008
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicСейчас будешь исправлятне, после меня и то что уже работало перестанет
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576018
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanне, после меня и то что уже работало перестанет
Тогда Вы может сами быстрее чем я переделаете Тестовый пример? Код выше имеется!...)))
Зато ломать свое не жалко будет!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576040
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, подскажите плизз...
Взял за основу следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var file_, map : dword;
    buf: pointer;
begin
  file_ := CreateFile('f:\apm_original.bin', GENERIC_READ, FILE_SHARE_READ,
  nil, OPEN_EXISTING, 0, 0);
  if file_ <> INVALID_HANDLE_VALUE then
    try
      map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil); // В этой строке map=0 !!!
      if map <> 0 then
        try
          buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
          if buf <> nil then
            try

              // now here you have your file1.txt in memory
              // beginning at pointer "buf"

            finally UnmapViewOfFile(buf) end;
        finally CloseHandle(map) end;
    finally CloseHandle(file_) end;
end;

end.

Дальше помеченной строки - не идет, потому как map=0!
Что нужно подправить?
Может еще где ошибки есть тут?
...
Ну и сокровенный вопрос - после Маппинга, каким образом читать байты и передвигать поинтеры?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576083
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicДальше помеченной строки - не идет, потому как map=0!
Что нужно подправить?
В строке:
Код: pascal
1.
map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil);


Заменил параметр PAGE_READWRITE на PAGE_READONLY и map стал ненулевым!
А что - нельзя было оставить???
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576095
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Просто ты файл открыл ну чтение. Можно рид-райт если есть соответсвующие права на файл
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576124
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576143
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62Bellic,
MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes.
Парни, погодите чуток!
Поздно уже "пить Боржоми"! - Код почти готов, затыка малюсенькая осталась! Щас курну и побе Ж у ее!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576162
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПомоЖите... голову сломал уже..(((

Код: pascal
1.
2.
3.
OriginalBuf // Это готовый Поинтер на Мап-файл

PO := PByte(OriginalBuf);

Как теперь считать байт ISimvol по этому Поинтеру, чтоб позже сделать инкремент:
Код: pascal
1.
Inc(PO);

Короче - запутался!!!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576171
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все!
Разобрался сам...)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576176
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576185
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На основе "Memory-Mapped File" получился следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;

BOriginal: TBytes;
BPereveden: TBytes;

MOriginal, OriginalMap: DWORD;
MPereveden, PerevedenMap: DWORD;
OriginalBuf, PerevedenBuf: Pointer;

pCurrent: Pointer;
PO: PByte;
PP: PByte;

begin
     try
          MainMemo.Lines.Clear;

          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;
          FullPerevedenFileName := FileBinPerevedenEdit.Text;
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FOriginal := TFileStream.Create(FullOriginalFileName, fmOpenRead, fmShareDenyNone);
          FPereveden := TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmShareDenyNone);
          SizeOriginal := FOriginal.Size;
          SizePereveden := FPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;

          MOriginal := CreateFile(pChar(FullOriginalFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0,0);
          MPereveden := CreateFile(pChar(FullPerevedenFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0,0);

          if (MOriginal <> INVALID_HANDLE_VALUE) and (MPereveden <> INVALID_HANDLE_VALUE) then
               try
                    OriginalMap := CreateFileMapping(MOriginal, nil, PAGE_READONLY, 0, 0, nil);
                    PerevedenMap := CreateFileMapping(MPereveden, nil, PAGE_READONLY, 0, 0, nil);

                    if (OriginalMap <> 0) and (PerevedenMap <> 0) then
                         try
                              OriginalBuf := MapViewOfFile(OriginalMap, FILE_MAP_READ, 0, 0, 0);
                              PerevedenBuf := MapViewOfFile(PerevedenMap, FILE_MAP_READ, 0, 0, 0);
                              if (OriginalBuf <> nil) and (PerevedenBuf <> nil) then
                                   try
                                        AddressFiles := 0;
                                        StartTime := Now;        // Фиксируем время Старта

                                        PO := PByte(OriginalBuf);
                                        PP := PByte(PerevedenBuf);

                                        while AddressFiles <= SizeOriginal-1 do
                                             begin
                                                  ISimvol := Byte(PO^);
                                                  PSimvol := Byte(PP^);
                                                  Inc(PO);
                                                  Inc(PP);
                                                  Inc(AddressFiles);

                                                  // Ищем совпадение Нулевых байт
                                                  if (ISimvol=0) and (PSimvol=0) then
                                                       begin
                                                            //ProgressBar.Position := AddressFiles;
                                                       end;
                                             end;
                                   finally
                                        UnmapViewOfFile(OriginalBuf);
                                        UnmapViewOfFile(PerevedenBuf);
                                   end;
                         finally
                              CloseHandle(OriginalMap);
                              CloseHandle(PerevedenMap);
                         end;
               finally
                    CloseHandle(MOriginal);
                    CloseHandle(MPereveden);
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;

          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "TBytes" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Время выполнения все того же Тестового цикла: 0,724 секунды!
Так что MMF не показал достойных результатов к сожалению!
Зато я малость набил руку!...
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576192
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonMmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное.Если это ответ на моё сообщение, то я про это и написал, м.б. не совсем внятно)), что если можно загрузить в память (например если файлы несколько десятков Мб), то проще и (наверное) быстрее так и сделать - загрузить в память.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576220
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Времечко бежит и скоро нужно уже садиться за руль...

Вернусь всеж к одному месту в реальной Процедуре:
Код: pascal
1.
SStroka := SStroka + AnsiChar(ISimvol);

В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных.

Конкатенация тут мне полезна по двум причинам:

1 . Не надо следить за указателем.
2 . Строка - есть Массив и к тому же - "безразмерный"!

Вторая причина - пожалуй самая главная ! - Нет необходимости объявлять размер заранее!

P.S. Думаю мои эксперименты будут полезны не только мне как получение опыта, но и другим новичкам, кто позже найдет эту тему!?
Всем, огромное спасибо! - В том числе и за "молчание", позволившее самому до всего "допетрить"!...
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576280
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic... Время выполнения все того же Тестового цикла: 0,724 секунды!
Так что MMF не показал достойных результатов к сожалению!
Принципиальное отличие между MMF и варианта на основе TBytes в следующих строках:
Код: pascal
1.
2.
3.
// Читаем Оба файла в TBytes
 FOriginal.ReadBuffer(BOriginal, SizeOriginal);
 FPereveden.ReadBuffer(BPereveden, SizePereveden);

Обработка цикла TBytes производится только в памяти, а цикл в MMF - буферизированное чтение с диска. Буферезацией занимается Windows. Так что сравнение не совсем корректное.
BellicВернусь всеж к одному месту в реальной Процедуре:
Код: pascal
1.
SStroka := SStroka + AnsiChar(ISimvol);

В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных.При большом объеме даных и частом вызове есть вероятность фрагментации памяти. Для уменьшения фрагментации можно использовать массив по аналогии с TList.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576323
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Freedoom, тут было сравнение времени для использования в реальной процедуре, а не чисто дле теории!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576386
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic, побайтовое чтение с диска будет намного медленнее, чем чтение блоком всего файла. Это очевидный факт, на мой взгляд, не требующий таких вариантов проверки.
...
Рейтинг: 0 / 0
25 сообщений из 112, страница 4 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]