Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
Просто_новичок   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.044 c
15-1178122069
ArtemESC
2007-05-02 20:07
2007.06.03
А как проверить, что это директория, а не файл...


15-1178037925
sayuki
2007-05-01 20:45
2007.06.03
Version Control


2-1179381387
Oleg_teacher
2007-05-17 09:56
2007.06.03
Фильтрацыя


3-1174044671
valua
2007-03-16 14:31
2007.06.03
БД и Word


1-1175703579
Medusa__
2007-04-04 20:19
2007.06.03
Масштабирование при распечатке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский