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

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

FileRead(Write)


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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