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

Вниз

Медленная и быстрая работа с файлом.   Найти похожие ветки 

 
мишаня   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
9-1150618621
ors_archangel
2006-06-18 12:17
2007.05.20
Сихнронизация компов игры


15-1177261165
Tempp
2007-04-22 20:59
2007.05.20
Деньги - зло!


6-1163695742
p314
2006-11-16 19:49
2007.05.20
ssl


2-1178222132
Ламер 2.Х
2007-05-03 23:55
2007.05.20
Присловутый реестр XP


1-1174368333
Fin
2007-03-20 08:25
2007.05.20
Формирование отчёта в FastReport