Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизМедленная и быстрая работа с файлом. Найти похожие ветки
← →
мишаня (2007-03-24 17:01) [0]нужно провести компьютерное исследование случайной величины. проподим эксперимент много раз и записываем результат в файл. кашдый результат должен быть 1 байту в файле.
procedure TfrmMain.btnGenerateClick(Sender: TObject);
var
dataFile : file of ShortInt; // Файл данных с результатами измерения
// случайной величины
filename : String; // Имя файла
N : Integer; // Число экспериментов
b : ShortInt; // Значение случайной величины в эксперименте
s : ShortInt; // Значение выстрела
i,j : Integer;
begin
N := StrToInt(leExperimentNumber.Text);
filename := leFileName.Text;
// Попытка открыть файл для записи
AssignFile(dataFile, filename);
Rewrite(dataFile);
Randomize;
// проводим N экспериментов
for i := 1 to N do
begin
b := 0;
// в каждом стеляем 3 раза по мишени
for j := 1 to 3 do
begin
s := Random(10);
if s < 5 then
// попали в 1й круг
b := b+10
else if s < 8 then
// попали во 2й круг
b := b+5
else
// попали в 3й круг
b := b-1
end;
Write(dataFile, b);
end;
// Закрытие файла
CloseFile(dataFile);
end;
при числе экспериментов N=1000000 это все работает секунт 20. Процессор Core2 duo, 2gb оперативки. Думаю это все изза записи в файл. Почему так?
причем, если заменяем 2 строчки:
dataFile : file of ShortInt;
на
dataFile : Textfile;
и
Write(dataFile, b);
на
Write(dataFile, chr(b));
на миллионе даже не успеваю заметить, как все сгенерировано.
Откуда же такая разница? я думал в типизированных файлах наооборот должно все быстрее работать????
← →
Servelat © (2007-03-24 17:28) [1]Провел эксперимент.
Вышеприведенный код у меня как для типизированного файла, так и для текстового выполняется от 1,281 секунды до 1,453 секунды (делал попыток по 10 каждым методом). Ничего особо криминального не вижу, время записи по сути одинаково, разброс на 0,2 секунды из-за рандома (два вызова random"а занимают вообще говоря различное случайное время afaik, а раз ты в цикле вызываешь, причем много раз, то общее количество затраченного на весь цикл времени будет стремиться к нормальному распределению ^^ ну это так к слову). Можно немного ускорить запись, если сначала нагенерировать чисел в память (массив), а потом этот массив куском записать (в нетипизированный файл).
← →
GrayFace © (2007-03-24 17:56) [2]мишаня (24.03.07 17:01)
Откуда же такая разница? я думал в типизированных файлах наооборот должно все быстрее работать????
В текстовых есть буферизация, а в типизированных, видимо, нету.
← →
мишаня (2007-03-25 04:41) [3]Servelat, ну у меня почему-то огромная разница во времени, и это именно из-за записи в файл, т.к. если убираем запись в файл, то это все естесственно выполняется мгновенно.
хм.. почему именно нормальное распределение не совсем понял ))
← →
Servelat © (2007-03-25 23:12) [4]> почему именно нормальное распределение не совсем понял )
> )
http://ru.wikipedia.org/wiki/Центральная_предельная_теорема
> ну у меня почему-то огромная разница во времени
Уже упоминалось, организуй буферизацию, вполне вероятно, что поможет. Или, если надо быстро и чтоб работало - используй текстовые файлы, с которыми у тебя все в порядке.
Указать конкретную причину затрудняюсь, ибо у меня проблема не наблюдается, а изучить ее на расстоянии довольно сложно. (=.
← →
AHTOH (2007-03-26 11:10) [5]А может писать данные в поток (TMemoryStream), а потом его весь сохранить в файл?
← →
SlymRO © (2007-03-26 12:21) [6]Textfile имеет буфер 127 байт... у file of ShortInt его нет... в и вся разница
← →
SlymRO © (2007-03-26 12:30) [7]
procedure TForm1.btnGenerateClick(Sender: TObject);
var
dataFile : file of ShortInt; // Файл данных с результатами измерения
Buf:array[byte] of ShortInt; // случайной величины
BufPos:byte;
filename : String; // Имя файла
N : Integer; // Число экспериментов
b : ShortInt; // Значение случайной величины в эксперименте
s : ShortInt; // Значение выстрела
i,j : Integer;
begin
N := StrToInt(leExperimentNumber.Text);
filename := leFileName.Text;
// Попытка открыть файл для записи
AssignFile(dataFile, filename);
Rewrite(dataFile);
BufPos:=0;
Randomize;
// проводим N экспериментов
for i := 1 to N do
begin
b := 0;
// в каждом стеляем 3 раза по мишени
for j := 1 to 3 do
begin
s := Random(10);
if s < 5 then
// попали в 1й круг
b := b+10
else if s < 8 then
// попали во 2й круг
b := b+5
else
// попали в 3й круг
b := b-1
end;
Buf[BufPos]:=b;
Inc(BufPos);
if BufPos=MaxByte then
begin
BlockWrite(dataFile,Buf,BufPos);
BufPos:=0;
end;
end;
if BufPos<>0 then
begin
BlockWrite(dataFile,Buf,BufPos);
BufPos:=0;
end;
// Закрытие файла
CloseFile(dataFile);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c