![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чтение массива double с помощью TFileStream [D7]
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, который блокирует перерисовку и прочие лишние вещи при массовой модификации данных.