![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FileRead(Write)
SMAC © (2006-02-27 18:20:00)Ув. мастера!
Мои данные представляют из себя таблицу и хранятся в текстовом ASCII файле. Например:
0,1 123 544 600
0,2 124 544 650
...
1,1 127 545 800
...
Файл довольно большой (неск. мегабайт). Хочу загрузить в свою программу как массив (а потом обработать). Быстро.
Если же читаю файл с данными построчно и разделяю на фрагменты, а потом еще и перевожу из строк в числа - получается очень медленно.
Похожим извращением я занимался тогда, когда примерно таким же способом загружал текстовый файл в TMemo несколько лет назад. А оказалось, что есть такая штука как LoadFromFileи всё встало на свои места. Есть ли аналогичные методы и для моего случая?
Интересует также и запись в файл (потом, после обработки).
Заранее спасибо.
Mikhail V (2006-02-28 13:10:00) [21]Win32 Developer's References
SMAC (2006-02-28 13:09:00) [22]
> См. File Mapping
Где? По F1 нет ничего.
Mikhail V (2006-02-28 13:00:00) [23]См. File Mapping
SMAC (2006-02-28 12:44:00) [24]
> Судя по приведенному фрагменту внутр.структуры файла длины
> всех строк, записанных в него, одинаковы, а поля в каждой
> из строковых записей фиксированы по смещениям отн-но начала
> строки
Это только в том куске, который я привел, а так может быть произвольной:
0,1 123 544 600
0,2 124 544 650
...
10,1 1027 545 400
...
И даже (в других файлах) через степень "E":
скажем, 1,245683E+3
Во всяком случае перевожу всегда с помощью
functionStrToFloat( constS: string): Extended;
Исходный массив: arrayof string;
Конечный массив: arrayof Extended;
Это если подробнее.
SMAC (2006-02-28 12:31:00) [25]А подробнее?
Mikhail V (2006-02-28 10:32:00) [26]Отображение в память не ускорит дело?
Сергей М. (2006-02-28 10:19:00) [27]
> ускорить работу можно путем использования указателей и буферов
Смотря что подразумевать под "работой" ..
> сохранять можно попробовать и в ВД и в нетипизированном
> файле
Судя по приведенному фрагменту внутр.структуры файла длины всех строк, записанных в него, одинаковы, а поля в каждой из строковых записей фиксированы по смещениям отн-но начала строки
Следовательно, к строковым записям и полям в них можно обращаться с произвольным (а не последовательным) доступом, использовав обычный FileStream либо написав своего наследника TDataSet для навигации по файлу как по табличному НД.
SMAC (2006-02-28 09:51:00) [28]Для Desdechado.
Я пользуюсь результатами расчетов довольно древней специализированной программы, а у нее либо никак, либо только так можно наладить интерфейс.
А вот сохранять можно попробовать и в ВД и в нетипизированном файле. Кстати говоря - проверено горьким многолетним опытом - чем больше будет файл с данными и чем проще будет в нем представление отдельных значений - тем меньше вероятность потерять данные. Как у Архимедовского рычага - проигрываем в скорости - выигрываем в расстоянии.
Для Virgo_Style.
Попробую и так. Вообще-то когда-то очень давно что-то читал (зрительная память самая крепкая), что ускорить работу можно путем использования указателей и буферов. Кто что скажет?
Всем спасибо.
Virgo_Style (2006-02-27 19:39:00) [29]Desdechado © (27.02.06 19:08) [4]
это могут быть чьи-то логи.
Помнится, была на сайте статья насчет использования памяти. С подобной проблемой я когда-то сталкивался, но довольно давно, деталей уже не помню.
Кажется, удалось ускорить процесс, выбрасывая "тупые" фрагменты вроде
p:=pos(' ',S);
S1:=copy(S,1,p);
delete(S,1,p+1);
p:=pos(' ',S);
S2:=copy(S,1,p);
delete(S,1,p+1);
и заменяя их на разбиение строки в один проход, причем с минимумом выделений памяти под строку, т.е. нельзя делать
while S[i]<>' ' do begin,
S1:=S1+S[i];
inc(i);
end
а можно
j:=1;
SetLength(S1,100);
while S[i]<>' ' do begin
S1[j]:=S[i];
inc(i);
inc(j);
end;
вот... где-то что-то вроде того. Ну и чтение по возможности большими блоками, конечно.
Desdechado (2006-02-27 19:08:00) [30]какой смысл хранить таблицу в тексте, если ее можно хранить в БД?
Eraser (2006-02-27 18:57:00) [31]
> SMAC (27.02.06 18:48) [2]
> Имеется в виду загрузить содержимое файла в абстрактный
> TStringList и потом обрабатывать построчно?
Да, только TStringList не абстрактный.
> А почему ограничение в 10 Мб?
эт примерная цифра... чтобы памяти много не отъедала программа.
> По TFileStream
это другой подход, похожий на Readln, т.е. данные считываются не все сразу, а построчно... TFileStream в таких случаях лучше применять при значительных размерах файлов.
А вообще всё от конкретной ситуации зависит.
SMAC (2006-02-27 18:48:00) [32]Имеется в виду загрузить содержимое файла в абстрактный TStringList и потом обрабатывать построчно? А почему ограничение в 10 Мб?
Что касается скорости - этот способ наиболее быстрый? Ну, в сравнеии с ReadLn или TStream?
По TFileStreamнашел ещё http://www.delphimaster.ru/cgi-bin/forum.pl?id=1140545982&n=18.Похожая беда.
Eraser (2006-02-27 18:25:00) [33]
> SMAC (27.02.06 18:20)
> Есть ли аналогичные методы и для моего случая?
Если примерно до 10 МБ размер, то TStringList.LoadFromFile, иначе - TFileStream, по скорости будет не намного быстрее чем ReadLn.