Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
2-1177689968
Oleg_teacher
2007-04-27 20:06
2007.05.20
Обьединит файлы


15-1177089238
фывов
2007-04-20 21:13
2007.05.20
Как правильно прописать путь к PHP-скрипту?


2-1178101289
sergeyst
2007-05-02 14:21
2007.05.20
Как закрыть нужную форму?


15-1177202837
vasIZmax
2007-04-22 04:47
2007.05.20
Задачка


2-1178205311
Человек
2007-05-03 19:15
2007.05.20
Поиск





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский