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

Вниз

Частое обращение к жёсткому диску.   Найти похожие ветки 

 
Просто_новичок   (2007-05-13 16:18) [0]

Такая проблема:

var
f:file;
V:byte;
begin
AssignFile(f,"1.txt");
Rewrite(f,1);
... //Начало цикла
... // какой-то код, в переменную V кидаю определённое значение
BlockWrite(f,V,SizeOf(V))
// конец цикла
end;
Проблема в том, что у меня происходит около 1 миллиона обращений в цикле, то есть к файлу обращается 1 миллион раз и записывает в него какую-то новую информацию по байтам, в итоге записывает 1Мб. Но на 1 миллион обращений к файлу на жёстком диске уходит слишком много времени, у меня на компьютере чуть более 1-ой минуты. Нельзя ли как-то сначала записать весь этот мегабайт в память компьютера, без обращения к жёсткому диску, а потом уже полностью весь получившийся файл (1Мб) на жёсткий диск, в файл 1.txt
Так наверное будет работать гораздо быстрее... Подскажите пожалуйста, как решить данную проблему.


 
homm ©   (2007-05-13 16:19) [1]

> Нельзя ли как-то сначала записать весь этот мегабайт в память
> компьютера, без обращения к жёсткому диску, а потом уже
> полностью весь получившийся файл (1Мб) на жёсткий диск,
> в файл 1.txt

Можно.


 
Просто_новичок   (2007-05-13 16:22) [2]

homm, если можно, то как? Можешь написать...


 
Zeqfreed ©   (2007-05-13 16:24) [3]

Можешь не переживать, ОС за тебя все буферизирует. Реальных обращений к диску происходит гораздо меньше.


 
Просто_новичок   (2007-05-13 16:28) [4]

Но почему тогда у меня так долго выполняется этот код. Я пишу архиватор, дерево и таблицу перекодировки строит за 3 секунды. Но на то, чтобы записать новые значения битов для байтов в файл тратится более 1-ой минуты. Вот код:
procedure saveinfile;
var
ResFile:file;
i,j,Vrempam,Elinbyte:byte;
n,m,imfile,copyimfile,ras:string;
k:integer;
begin
m:="";
Elinbyte:=0;
// отделяем имя файла и его расширение
//***********************************
//imfile:=ExtractFileName(Form1.OpenDialog1.FileName);
imfile:=Form1.OpenDialog1.FileName;
for i:=0 to 255 do
begin
 k:=0;
 for j:=0 to length(imfile) do
 if imfile[k]<>"\" then inc(k) else break;
 if k<>length(imfile)+1 then
 imfile:=copy(imfile,k+1,length(imfile));
end;
//***********************************
// отделяем имя файла от расширения
//***********************************
k:=0;
copyimfile:=imfile;
imfile:="";
for i:=length(copyimfile) downto 0 do
 if copyimfile[i]<>"." then inc(k) else break;
for j:=1 to length(copyimfile)-k-1 do
imfile:=imfile+copyimfile[j];
ras:="";
for j:=length(imfile)+2 to length(copyimfile) do
ras:=ras+copyimfile[j];
//***********************************
AssignFile(ResFile,Directory+imfile+".pau"); // связываем логичческий файл ResFile с физ. файлом на дисе
Rewrite(ResFile,1);
Reset(IshFile,1); // открываем для чтения по одному символу
while not Eof(IshFile) do // читаем до конца файла
begin
 BlockRead(IshFile,VremPam,1); // в VremPam записываем i-ый символ
 for i:=0 to length(CopyDynMassBuk)-1 do
 begin
  if VremPam=StrToInt(CopyDynMassBuk[i])
  then begin n:=MassTabPer[i]; break; end;
 end;
 j:=1;
 while j<>length(n)+1 do
 begin
  if Elinbyte<8 then
  begin
   m:=m+n[j];
   inc(Elinbyte);
   inc(j);
  end else
  begin
   Elinbyte:=0;
   Vrempam:=StrToInt(m);
   m:="";
   BlockWrite(ResFile,Vrempam,SizeOf(Vrempam)); // в ResFile записываем Vrempam
  end;
 end;
end;
// Если остались биты не образовавшие байт, то заполняем остаток нулями
if Elinbyte<8 then
for i:=length(m) to 7 do
m:=m+"0";
Vrempam:=StrToInt(m);
BlockWrite(ResFile,Vrempam,SizeOf(Vrempam));
end;


 
homm ©   (2007-05-13 16:32) [5]

> homm, если можно, то как? Можешь написать...

Ты же сам все написал :))


> Можешь не переживать, ОС за тебя все буферизирует. Реальных
> обращений к диску происходит гораздо меньше.

Тем не менее ручная буферизация будет намного эффективнее, чем вызов системных функций.


 
Просто_новичок   (2007-05-13 16:35) [6]

homm, а можешь кинуть пример ручной буферизации, я даже не представляю себе что это такое и как с этим работать.


 
homm ©   (2007-05-13 17:29) [7]

Файлы то большие? Может имеет смысл целиком загрцзить первый в оперативу, сфоримровать второй и потом сохранить второй?



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

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

Наверх




Память: 0.49 MB
Время: 0.077 c
15-1178470182
ArtemESC
2007-05-06 20:49
2007.06.03
Диски FAT в OpenSuse 10.2


2-1179185998
delphino
2007-05-15 03:39
2007.06.03
Не могу изменить запись в главной таблице


2-1179105701
Ale][andr
2007-05-14 05:21
2007.06.03
Открытие файла


1-1176196280
Jakudza
2007-04-10 13:11
2007.06.03
Проблема при закрытии формы MDI из DLL


1-1175667957
DelphiLexx
2007-04-04 10:25
2007.06.03
Как в DBGridEh e запрептить перемещать колонки