![]() |
| ||
|
|
Новости |
Поиск |
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?
Самуилыч (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].
Я к тому, что "где здесь некая вычурная оптимизация"?