Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.01.2010, 19:34
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию Низкая скорость чтения из файла

вообщем вопрос, как повысить скорость чтения инфы из файла (данные в файле значение неимееют) в переменную ТИПА int, dword.
ибо скорость в 6 Мбайт в минуту ))))) конечно....
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
  #2  
Старый 13.01.2010, 19:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,016
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Дык ты код покажи сначала.
Хотя... 6 МБ в МИНУТУ - это у тебя тогда явные проблемы с железом...
Ответить с цитированием
  #3  
Старый 14.01.2010, 13:33
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию

)))))))))))))))))))))))))))))))))))))))
вопрос вот именно в этом
как повысить скорость чтения инфы из файла (данные в файле значение неимееют) в переменную ТИПА int, dword. ))))))))))
P.S. с железом как раз все в порядке.

Код:
var
  NumRead1, NumRead2, NumWritten: Integer;
  Buf: Byte;
  x, y, z: Byte;
  y1 : array [0..511] of byte;
  n, max, i: Integer;
  I1: Integer;
  m: array[1..3] of Integer;
  Stream1, stream2 : TFileStream;

begin
m[1]:=0;

  if OpenDialog1.Execute then
     begin
   Stream1:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
   m[1]:=Stream1.Size;
   Stream1.Seek(0, soFromBeginning);
      end;
  .....
For I:=0 to n1-1 do // цикл на количество секторов
   begin
 for i1:=0 to 511 do // побайтно внутри сектора
     begin
  Stream1.ReadBuffer(x, sizeof(x)); // считывание байта () из файла в переменную типа byte
......... 
  z:=x xor y;
.........
  stream2.WriteBuffer(z, sizeof(z));  // запись () в файл в переменной типа byte
        Position := i;
     end;
   end;
end;
...
END;

тормозит именно ЭТО! -
stream2.WriteBuffer(z, sizeof(z)); // запись байта () в файл в переменной типа byte
Stream1.ReadBuffer(x, sizeof(x)); // считывание байта () из файла в переменную типа byte

может ктото знает другой тип переменной ну.. скажем типа hex? или некий 16 - ричный тип переменных?
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
  #4  
Старый 14.01.2010, 14:25
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А обязятельно побайтно читать? Прочитай 512 байт сразу, сделай с ними что-нить и запиши обратно. Будет в 512 раз быстрее
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 22.01.2010, 02:12
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию

хм... а тип целого числа розмерносьтю в 512 байт неподскажеш? )))))))
))

в чьом проблема? проблема в том, чтобы зделать z:=x xor y; )))
а оно - только с целочисленными данными!!! ну.... понятно, там таблица анси символов и прочее... неважно. важно результот, который аж... аж .. 6 Мб/ мин. )))))))))
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
  #6  
Старый 22.01.2010, 02:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,016
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Читай в PChar, потом работай внутри него.
Собственно, в свое время именно таким образом у меня был построен поиск в одной программе. Она читала файл блоками по 64К и работала внутри них. Там правда было чуть сложнее, т.к. приходилось хитрым образом обрабатывать вариант, когда искомая строка находилась на границе блока.
Ответить с цитированием
  #7  
Старый 22.01.2010, 15:14
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Читай в PChar, потом работай внутри него.
Собственно, в свое время именно таким образом у меня был построен поиск в одной программе. Она читала файл блоками по 64К и работала внутри них. Там правда было чуть сложнее, т.к. приходилось хитрым образом обрабатывать вариант, когда искомая строка находилась на границе блока.

))
Цитата:
Сообщение от lmikle
проблема в том, чтобы зделать z:=x xor y; )))
а оно - только с целочисленными данными.

потом из чара переводить в целое... потом обратно.. пробовал - еще медленнее )))))))))
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
  #8  
Старый 22.01.2010, 15:26
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Где-то так
Код:
var
  ByteBuf: array[0..511] of Byte;
//...
Stream1.ReadBuffer(ByteBuf[0], 512);
for i1:=0 to 511 do
x := ByteBuf[i1];
Ответить с цитированием
  #9  
Старый 22.01.2010, 17:09
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию

спасибо - чуть быстрее ) есть еще идеи?
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
  #10  
Старый 22.01.2010, 18:10
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

поиграй размером блока ( можно за раз и 32кБ например а в конце остаток )
и как на счет записи - записывай тоже блоками.
Ответить с цитированием
  #11  
Старый 23.01.2010, 02:36
OnzMill OnzMill вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 48
Репутация: 10
По умолчанию

скажу сразу - размер блока аж никакущей роли неиграет )))) суть проблеммы - описана выше. считывание, или перевод вещественного типа в целочисленный
__________________
Говори что думаешь, думай, что говоришь.
(Шоссе 60)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter