Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Вниз

Скорость работы StringList и TextFile.   Найти похожие ветки 

 
iNew   (2003-07-21 08:59) [0]

While not EOF(TextFile) do
Begin
ReadLn(TextFile,Str);
FullStr:= FullStr + Str;
End;

MyStringList.LoadFromFile(TextFile);
For i:=0 to MyStringList.Count-1 do
Begin
FullStr:=FullStr + MyStringList.Strings[i];
End;

Почему второй алгоритм работает намного быстрее, чем первый?


 
VMcL   (2003-07-21 09:13) [1]

>iNew © (21.07.03 08:59)

Интересно, а как сработает такой вариант:

MyStringList.LoadFromFile(TextFile);
FullStr := MyStringList.Text;


?


 
Alex_***   (2003-07-21 09:19) [2]

->iNew Ты попробуй весь файл сразу подкачать, а потом его по символам разбирать


 
Alex_***   (2003-07-21 09:21) [3]

p.s И кстати можно сразу установить нужный размер FullStr


 
iNew   (2003-07-21 09:24) [4]

> Alex_*** (21.07.03 09:21)
И что если сразу установить нужный размер?


 
Alex_***   (2003-07-21 09:29) [5]

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


 
Bel   (2003-07-21 09:33) [6]

> Почему второй алгоритм работает намного быстрее, чем первый?

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


 
iNew   (2003-07-21 09:39) [7]

Ну и последний вопрос от ламера.
Как установить нужный размер FullStr?


 
Alex_***   (2003-07-21 09:42) [8]

SetLength


 
iNew   (2003-07-21 10:00) [9]

MyStringList.LoadFromFile(TextFile);
SetLength(FullStr,?) //И что вместо вопроса?
For i:=0 to MyStringList.Count-1 do
Begin
FullStr:=FullStr + MyStringList.Strings[i];
End;


 
Е-Моё имя   (2003-07-21 10:12) [10]

размер файла


 
iNew   (2003-07-21 10:39) [11]

Как получить этот размер из MyStringList?


 
ValeraVV   (2003-07-21 10:40) [12]

> VMcL © (21.07.03 09:13) - проще


 
iNew   (2003-07-21 10:42) [13]

> ValeraVV © (21.07.03 10:40)
Этот вариант мне не подходит.


 
Anatoly Podgoretsky   (2003-07-21 10:48) [14]

VMcL © (21.07.03 09:13)
Результаты будут разные!
FullStr1 <> FullStr2


 
iNew   (2003-07-21 11:03) [15]

И всё-таки как получить размер из MyStringList?
MyStringList.LoadFromFile(TextFile);
SetLength(FullStr,?) //И что вместо вопроса?
For i:=0 to MyStringList.Count-1 do
Begin
FullStr:=FullStr + MyStringList.Strings[i];
End;


 
Radionov Alexey   (2003-07-21 11:10) [16]

FullStr := MyStringList.Text.


 
Anatoly Podgoretsky   (2003-07-21 11:59) [17]

Radionov Alexey © (21.07.03 11:10)
Еще раз, результат будет абсолютно другой, чем при FullStr:=FullStr + MyStringList.Strings[i];


 
Serginio   (2003-07-21 12:03) [18]

На форумах постоянно вопрошают как лучше прочитать определенную строку по номеру
из текстового файла.
Для этого постоянно советуют использовать TStringList. Для определения каким
все таки способом лучше выполнить данную задачу и был проведен тест для чтения больших
текстовых файлов.

Специально были сделаны объекты для последовательного чтения текстовых файлов
как в прямом тат и в обратном направлении TTextReader и TTextBackReader использующие
кольцевой буффер размером 64 кб с ограничением на длину строки 64 кб - 3 байта.
Сразу предупреждаю, что не протестированы на все граничные условия.

Следует оговорить, что тест проходил на уже кэшируемом файле.
Не удивляйтесь скорости чтения 0.375 сек.


Размер тестируемого файла 148 888 907 бйт
Количество строк 10 000 001
============== Тест СтрингЛист============================
Использование TstringList
StringList Загрузка парсинг и выделение строк=9
Время освобождения StringList =1.594
Проверка TTextReader=6.657
Проверка TTextBackReader=8.562
==========================================
Использование TTextReader
Загрузка парсинг и выделение строк=3.391
Загрузка и парсинг без выделения строк=1.859

==========================================
Использование TTextBackReader
Загрузка парсинг и выделение строк=3.157
Загрузка и парсинг без выделения строк=1.828
==========================================
Использование старого Readln
Чтение Выделением строк=4.453
Чтение без Выделения строк=2.484
==========================================

Загрузка всего файла в память и парсинг аналогично TstringList
Выделение памяти=0.25
Загрузка всего файла в память =0.375
Парсинг =1.953
Итого =2.578

Сдесь сразу следует оговорить, что специально для TstringList был опреден Cappasity
равный количеству строк в текстовом файле. Иначе результаты разнились бы в разы из-за
перераспределения непрерывной памяти (Пример в директории MyMemmoryStream прекрасно
показывает недостатки использования непрерывной памяти большого объема ).
Кроме всего почего надо учесть, что на каждую не пустую строку дополнительно выделяется
13 байт (TUsed, Количество Ссылок, длина строки,#0) и TstringList выделяет 8 байт
(ссылка на строку и на объект) итого дополнительно 21 байт.
При 10 милионах записей это 210 мб памяти. И еще 148 888 907 бйт в буффере
и 128 888 907 на строки (за минусом #13#10).
Даже при моих ресурсах (750 мб-250 мб на видеопамять) использование файла подкачки
неизбежно.

Разница в скорости TTextReader и TTextBackReader обусловлена на отсутствии сравнения в
TTextBackReader сравнения на #0 и работой Менеджера Памяти, так как TTextBackReader
сначала считывает строки большего размера.

Незнание конкретной реализации FileText оставляю без комментариев.
В любом случае использования TstringList для чтения строк не опрадано.


 
Serginio   (2003-07-21 12:05) [19]

Исходники на http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019


 
VMcL   (2003-07-21 13:53) [20]

>Anatoly Podgoretsky © (21.07.03 10:48)

Угу. Был невнимателен.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
8-10310
Тролль
2003-04-09 06:56
2003.08.04
Пропорции видео


4-10502
acsoft
2003-06-01 15:37
2003.08.04
Как сделать треугольное окно с углами в точках, например [0,0],[5


7-10469
aklymenko
2003-05-23 10:48
2003.08.04
ВЕСЫ


4-10505
nstyx
2003-05-30 00:09
2003.08.04
картинку на форму


7-10480
fil
2003-05-25 11:58
2003.08.04
Автозагрузка программы как сервис в win NT 2000 XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский