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?


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


> Ega23 ©   (19.01.12 01:43) [64]

Как? А твой любимый TFileStream - это разве не ООП?


Ega23   (2012-01-19 01:43:00) [22]


> ООП - штука отличная, но далеко не всегда самая эффективная.

А где тут ООП?


Германн   (2012-01-19 01:33:00) [23]


> Inovet ©   (18.01.12 23:51) [57]
>
> > [55] Jeer ©   (18.01.12 23:38)
> > т.к. содержит неявное указание на возможность оптимизации
> > по размеру файла
>
> В смысле на выделение памяти

Вообще-то в задаче Jeer ©   (18.01.12 22:49) [48] об оптимизации памяти или о её перераспределении речи не было.


Самуилыч   (2012-01-19 01:30:00) [24]


> Ega23 ©   (19.01.12 01:19) [60]

Хех... дружище, ООП - штука отличная, но далеко не всегда самая эффективная. Потому что накладных расходов довольно много бывает.


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

Вообще, можно еще помудрить с элементами массива.

Размер элемента известен: SizeOf(Pointer) + 2 * SizeOf(Double)
Число элеменов тоже известно (см. [58]).

Значит, можно разом выделить память одним экстентом под все элементы массива, а в цикле только заполнять их и проставлять в массив их адреса.


Ega23   (2012-01-19 01:19:00) [26]


> Можно. Но после того, как скажешь, где я тебя обманул.

детский сад.


Самуилыч   (2012-01-19 01:17:00) [27]


> Значит, число строк в файле N не более: размер_файла / 9
> Создаем TStringList и ставим ему Capacity = N

Здесь надо заменить N на M, иначе путаница.


Самуилыч   (2012-01-19 01:14:00) [28]

Навскидку. Наверное, не самое лучшее, но первое, что пришло в голову.

Любая строка в файле не короче 9 символов : N.N_N.N CR LF
Значит, число строк в файле N не более: размер_файла / 9

Создаем TStringList и ставим ему Capacity = N
Потом LoadFromFile - получаем по 2 числа в строке и реальный Count.
Потом SetLength массиву.
Потом в цикле создаем и заполняем элементы массива.


Inovet   (2012-01-18 23:51:00) [29]

> [55] Jeer ©   (18.01.12 23:38)
> т.к. содержит неявное указание на возможность оптимизации
> по размеру файла

В смысле на выделение памяти зараз по предположительному количеству чисел? Я сразу подумал как бы так её выделить чтобы не перевыделять потом и слишком много не хапнуть.


Jeer   (2012-01-18 23:50:00) [30]


> Снова ай-яй-яй.


Слов много, толку мало.
Не образовательно говоришь, а потому бесперспективно..


Jeer   (2012-01-18 23:38:00) [31]

Я к тому, что если уж бодаться, то хотя бы на некоторой более-менее правдоподобно описанной и востребованной ситуации.
Надо было бы конечно ввести более широкое представление чисел, ну и я упростил, но и заложил "мину".

Вот  к чему был "изобретен" это тест.
Он с подвохом, т.к. содержит неявное указание на возможность оптимизации по размеру файла, если это конечно пригодится.


Jeer   (2012-01-18 23:35:00) [32]


> Я правильно понял, что до запятой только одна цифра?


Ну да.


Самуилыч   (2012-01-18 23:31:00) [33]

> Ega23 ©   (18.01.12 22:28) [46]

> Можно код посмотреть?
Можно. Но после того, как скажешь, где я тебя обманул. Причем сразу говорю - я тебя действительно обманул, но не в цифрах, цифры совершенно реальные. И Assign, Reset - тоже без обмана, реально в коде использовал.

> Я к тому, что "где здесь некая вычурная оптимизация"?
Почему "вычурная"? Обычная оптимизация. Человек написал код, скорость его не устраивает, он спросил, как ускорить - это и есть оптимизация. Вся ветка о ней и есть.

> Ega23 ©   (18.01.12 22:29) [47]
> Формат текстового файла приведи, пожалуйста.

Снова ай-яй-яй. Ты отвечал на мой ответ на [41], а в [41] четко сказано - readln. Значит, формат очевиден - одно число в строке, в текстовом файле.


Dennis I. Komarov   (2012-01-18 23:30:00) [34]

Сорри за офф, навеяло:
ФаМиРеДоСольСоль :)


Ega23   (2012-01-18 23:11:00) [35]


> 1. ANSI, какой на фик уникоде для чисел :)


Файл-то текстовый...

Я правильно понял, что до запятой только одна цифра?


Jeer   (2012-01-18 22:56:00) [36]

1. ANSI, какой на фик уникоде для чисел :)
2. Да, отдельная строка на (*x,*y)

Данные - предположительно шумовой процесс, т.е. число цифр после запятой с большой вероятностью будет именно 9 ( это просто для примера ).


Ega23   (2012-01-18 22:52:00) [37]


> Jeer ©   (18.01.12 22:49) [48]

Треба уточнение:
1. ANSI или UNICODE?
2. Я правильно понял, что каждый экземпляр TCoords записано отдельной строкой?


Jeer   (2012-01-18 22:49:00) [38]

Ну как, спецы, оптимизируем ?
Наиболее быстрый способ чтения текстового файла и парсинга в  дин. массив ?  
type
 TCoords = class
   X: double; Y: double
 end;

var
 arCoords: array of TCoords;

Число строк: >= 100 тыс и <= 10 млн.

Формат каждой строки файла - два числа в формате фиксированной точки.
+/-N.9N_+/-N.9N

"_" - символ "пробел" ( #32 )
+/- - знак  (плюс может отсутствовать)
N - цифровой символ
. - десятичная точка
9N - число цифровых символов, не более 9, но не менее 1.

Первое число - X, второе - Y.


Ega23   (2012-01-18 22:29:00) [39]


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


Формат текстового файла приведи, пожалуйста.


Ega23   (2012-01-18 22:28:00) [40]


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


Можно код посмотреть?


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


Я к тому, что "где здесь некая вычурная оптимизация"?


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

Наверх

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