Форум: "Начинающим";
Текущий архив: 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