Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизКоличество строк Найти похожие ветки
← →
FANAT © (2005-05-30 07:17) [0]Или такого нет.... или я забыл....
как подсчитать количество строк в текстовом файле и взять предпоследнюю строку?
← →
Rep © (2005-05-30 07:30) [1]Например так:
Var
SL:TSringList;
...
SL.LoadFromFile("sdsdsds.txt");
STR:=SL[SL.Count-2];
← →
Alx2 © (2005-05-30 07:32) [2]FANAT © (30.05.05 7:17)
Var F : System.Text;
Prev_S, S : String;
l_Count : Integer;
begin
AssignFile(F,FileName);
Reset(F);
try
l_Count :=0;
S :="";
while not eof(F) do
begin
Prev_S :=S;
ReadLn(F,S);
inc(l_count);
end;
finally
closefile(F);
end;
end;
← →
TUser © (2005-05-30 07:33) [3]TStringList.LoadFromFile
TStringList.Count
TStringList.Strings
← →
TUser © (2005-05-30 07:41) [4][2] - очень медленный метод
← →
Alx2 © (2005-05-30 07:42) [5]>Rep © (30.05.05 07:30)
>TUser © (30.05.05 07:33)
Вот все мало вам тормозных программ :)
← →
Alx2 © (2005-05-30 08:31) [6]TUser © (30.05.05 7:41) [4]
Проверил на 700 Mb файле.
Вариант с Readln ~ 35 сек.
Вариант с TstringList не дождался - ждал более 15 мин.
Машина P4 1800 с 512 Mb RAM
На мелочи, действительно, TStringList быстрее на ~20-25% засчет чтения файла "целиком". Но ростом размера файла идет почти экспоненциальный спад производительности, когда места в памяти недостаточно.
И оно надо - все целиком в память?
← →
TUser © (2005-05-30 08:36) [7]Чего-то не то проверял. На больших файлах TStringList как раз намного быстрее, а на маленьких файлах - разница практически незаметна
← →
Alx2 © (2005-05-30 08:42) [8]TUser © (30.05.05 8:36) [7]
Но ведь убедиться самому недолго?
← →
Anatoly Podgoretsky © (2005-05-30 10:09) [9]Alx2 © (30.05.05 08:31) [6]
Лучше бы ты дождался, тогда наверно удивление было бы еще больше.
Предлагаю провести эксперимент, сделать файлик скажем из одного миллиона строк из одного символа и загрузить в TStringList при этом понаблюдать за расходом памяти. Только на всякий случай запасись валидолом.
← →
Alx2 © (2005-05-30 10:16) [10]Anatoly Podgoretsky © (30.05.05 10:09) [9]
Нет, Анатолий. Спасибо. Я, возможно, и извращенец кое в чем. Но сие уже выходит за все границы :))
← →
TUser © (2005-05-30 11:44) [11]Хм, действительно - убедился в ложности своих убеждений.
← →
MBo © (2005-05-30 13:27) [12]маленький вопросик автору ветки - есть ли нужда считать строки?
Если задача состоит только в выделении предпоследней - то этого вообще-то не требуется...
← →
KilkennyCat © (2005-05-30 13:38) [13]
> [12] MBo © (30.05.05 13:27)
Логично. Просто просмотреть файл с конца до нужного перевода. В принципе, и строки сосчитать так будет быстрее. Только не методом ReadLn :))
← →
Alx2 © (2005-05-30 13:44) [14]Да. Офигенная проблема...
← →
BFG9k © (2005-05-30 17:17) [15]
> KilkennyCat © (30.05.05 13:38) [13]
>
> Логично. Просто просмотреть файл с конца до нужного перевода.
> В принципе, и строки сосчитать так будет быстрее. Только
> не методом ReadLn :))
Подсчет строк с конца файла по скорости равен (а возможно и медленнее) подсчету с начала. Для того чтобы сосчитать строки, нужно сосчитать ВСЕ символы перевода строк в файле. Для этого так или иначе придется читать файл целиком.
← →
KilkennyCat © (2005-05-30 18:15) [16]
> [15] BFG9k © (30.05.05 17:17)
гениально. я имел ввиду нахождение предпоследней строки.
← →
BFG9k © (2005-05-30 18:51) [17]2 KilkennyCat :
> В принципе, и строки сосчитать так будет быстрее
Нет смысла оправдываться :)
← →
Anatoly Podgoretsky © (2005-05-30 20:01) [18]BFG9k © (30.05.05 18:51) [17]
Правильно, поскольку оправдываться нужно тебе.
← →
raidan © (2005-05-30 20:38) [19]Я б его blockread"ом ел и парсил бы на количество #13#10 :)
← →
Чапаев © (2005-05-30 21:23) [20]> Я б его blockread"ом ел и парсил бы на количество #13#10 :)
Причём читал бы с конца блоками по 512..8192 байта.
← →
raidan © (2005-05-30 21:41) [21]>Чапаев © (30.05.05 21:23) [20]
С другой стороны, нужно попробовать read"ом - читать посимвольно :)))
Ща поэкспериментирую...
← →
BFG9k © (2005-05-30 21:50) [22]
> Anatoly Podgoretsky © (30.05.05 20:01) [18]
> BFG9k © (30.05.05 18:51) [17]
> Правильно, поскольку оправдываться нужно тебе.
Обойдемся без демагогии. Между "считать" и "сосчитать" есть кое-какая разница.
← →
raidan © (2005-05-30 22:10) [23]Не, старый добрый blockread (8192) на слабеньком П3-500 всех уел :)
С четырехкратным превосходством над ReadLn на файлике в 52 метра (строка от 1 до 100 символов рандомом) и двукратным на файлике в 210 метров (строка 19 символов длиной всегда)...
← →
BFG9k © (2005-05-30 22:17) [24]radian :
Кажется борланд не рекомендует использовать старые паскалевские функции вроде read, write и т.д. Как насчет FileCreate (или CreateFile , не помню точно) , FileRead и FileWrite ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c