Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чтение массива double с помощью TFileStream [D7]


Страницы:   1 2 3 4 5

Alexander123 ©   (2012-01-17 18:11:00) 

Имеется текстовый файл с числами. Пытаюсь считать их вот таким способом:

var
fs: TFileStream;
A: array [0..9] of double;
begin
if opendialog1.Execute then
begin
fs:=TFileStream.Create(opendialog1.FileName, fmOpenRead);
fs.Read(A[0], sizeof(A));
...

При дальнейшей работе получаются значения которых не было в файле. Как решить проблему? Или обязательно считывать данные как byte и потом уже переводить в double?


Jeer   (2012-01-18 22:13:00) [41]


> Что я (или не я?) делаю не так?


Число процессоров не учитываешь :)


Самуилыч   (2012-01-18 21:55:00) [42]

> Ega23 ©   (18.01.12 21:16) [43]

> Где тут оптимизация-то?
Вообще-то, как раз о ней речь с самого начала и идет. Еще с [0].

> Если с умом, то вполне себе быстро.
Не затруднит примерчег быстрого заполнения массива double из текстового файла?

------------

Я тут последовал твоему совету "возьми и проверь". Именно на 10 млн чисел. Вот мои результаты: FileStream - 125 ms. Assign: 62 ms.

Разница не очень большая, всего в 2 раза. Но почему-то в другую сторону. Что я (или не я?) делаю не так?


Ega23   (2012-01-18 21:16:00) [43]


> Ничего. И не надо превращать оптимизацию в самоцель. Спорить
> тут не о чем.


Где тут оптимизация-то? Абсолютно штатная операция.


> А что, разве кто сомневался, что текстовый файл - это медленно?


Если с умом, то вполне себе быстро.


Самуилыч   (2012-01-18 21:01:00) [44]

> Ega23 ©   (18.01.12 20:08) [40]

Ты бы еще сотню миллиардов чисел взял. Речь идет о конкретной задаче -
и автор четко написал: миллион точек. По твоим же данным это примерно полторы секунды. Аффигительное время, да? Пару раз моргнуть успеешь.

В [25] сказано: "считывание происходит моментально". Что еще нужно?

Ничего. И не надо превращать оптимизацию в самоцель. Спорить тут не о чем.

> Андреевич  (18.01.12 20:38) [41]

А что, разве кто сомневался, что текстовый файл - это медленно?


Андреевич   (2012-01-18 20:38:00) [45]

c readln() вообще может получиться адски медленно ( http://forum.sources.ru/index.php?showtopic=326171&view=findpost&p=2848363:) )


Ega23   (2012-01-18 20:08:00) [46]


> Во-вторых, AssignFile-Reset-Read-CloseFile - это не сложный,
>  а, наверное, наоборот, самый простой способ чтения файла
> на Паскале.


1. Речь не о Паскале, а о Delphi 7. И  FileStream тут будет гораздо более удобней. И проще. В связи с этим


> Во-первых, я предлагаю не использовать "доводы" типа [32].


вкупе с [31] воспринимается смешно.


> В-третьих, при любом способе (сразу весь или кусками) будет
> буферизация, поэтому разница не должна быть большой


А ты возьми и проверь. На 10 миллионов значений. FileStream - 93 ms. Assign-Read-Close: 16708 ms
Разница не очень большая, всего в 180 раз. Буферизация, тем более... :)


Самуилыч   (2012-01-18 19:43:00) [47]


> Ega23 ©   (18.01.12 16:53) [37]

Во-первых, я предлагаю не использовать "доводы" типа [32].

Во-вторых, AssignFile-Reset-Read-CloseFile - это не сложный, а, наверное, наоборот, самый простой способ чтения файла на Паскале.

В-третьих, при любом способе (сразу весь или кусками) будет буферизация, поэтому разница не должна быть большой. И в [25] автор написал, что даже при чтении кусками тормоза совсем в другом - так что способ чтения здесь тем более по барабану.


Dennis I. Komarov   (2012-01-18 17:53:00) [48]


> sniknik ©   (18.01.12 12:32) [34]

У меня?
У меня нет такого файла, и я даже не знаю его структуры. Откуда могут у меня появится проблемы. :)


Ega23   (2012-01-18 16:53:00) [49]


>  ведь это уже демагогия... некрасиво же. Ай-яй-яй.


Ты предлагаешь сравнить варианты с последовательным чтением каждого double, или чтения целиком?


Самуилыч   (2012-01-18 16:34:00) [50]


> Ega23 ©   (18.01.12 11:57) [32]

Дружище, фии... ведь это уже демагогия... некрасиво же. Ай-яй-яй.


sniknik   (2012-01-18 12:34:00) [51]

> читать не в массив
+
а если и сохранять как рекордсет, то и с чтением меньше мороки.


sniknik   (2012-01-18 12:32:00) [52]

> но [11] же...
и что? рекорсед это такой же набор данных как массив например. все воспринимают его как "= база", но это неправильно. читать не в массив, а в рекордсет и все дела. проблема?


Dennis I. Komarov   (2012-01-18 11:58:00) [53]


> sniknik ©   (18.01.12 00:17) [18]

само собой, но [11] же...


Ega23   (2012-01-18 11:57:00) [54]


> AssignFile, Reset, Read, CloseFile - ЭТО сложно?


На асме сразу пиши, там, в целом, тоже ничего сложного нет.


Самуилыч   (2012-01-18 11:51:00) [55]

> Ega23 ©   (18.01.12 02:11) [22]
> Зачем так сложно?

AssignFile, Reset, Read, CloseFile - ЭТО сложно?
Хм... или LOL ?


Ega23   (2012-01-18 11:40:00) [56]


> Спроси у своего отца, Олег. Достаточно ли физику один раз
> считать файл с данными, чтобы "нормально" обработать результаты
> некоего "физэксперимента"?


А чё его спрашивать, я ему несколько тулз писал , пока лаборантом работал. Вполне достаточно, если файл нормально структурирован.


bumbum   (2012-01-18 11:35:00) [57]

И я предложу свой вариант:

var
s: TStringList;
begin
s:= TStringList.Create;
if opendialog1.Execute then
s.LoadFromFile(opendialog1.FileName);


Inovet   (2012-01-18 11:06:00) [58]

> [25] Alexander123 ©   (18.01.12 09:49)

Эта, текст форматировать желательно, а то ведь глаза ломаются, не за что зацепиться. Например так:

Var
 X,Y : Array of Double; // TChartValues
 t : Integer;
 Num : Integer;

begin
// 1M points
 Num:= 1000000;

// allocate our custom arrays
 SetLength(X,Num);
 SetLength(Y,Num);

// fill data in our custom arrays
 X[0]:=0;
 Y[0]:=Random(10000);
 for t:=1 to Num-1 do
 begin
   X[t]:=t;
   Y[t]:=Y[t-1]+Random(101)-50;
 end;

// set our X array
 With Series1.XValues do
 begin
   Value:=TChartValues(X);
   Count:=Num;
   Modified:=True;
 end;

// set our Y array
 With Series1.YValues do
 begin
   Value:=TChartValues(Y);
   Count:=Num;
   Modified:=True;
 end;

// Show data
 Series1.Repaint;

Сразу видно - чего-то не хватает. И у читающих больше желания просмотреть и вникнуть.


sniknik   (2012-01-18 10:50:00) [59]

> смысл этого в том, чтобы избегать использование addXY():
поищи другой смысл... ну например чтобы добавлять не точки, рекордсет к примеру.


Dimka Maslov   (2012-01-18 10:40:00) [60]


> Если файл размером несколько Мб, то график строится очень
> медленно, но если убрать строчку addxy(),


Наверняка у TChart есть метод типа BeginUpdate, который блокирует перерисовку и прочие лишние вещи при массовой модификации данных.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо