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

Вниз

Можно ли как-то оптимизировать работу со StringList?   Найти похожие ветки 

 
Aleksandr   (2002-09-27 16:20) [0]

У меня из большого файла грузится экземляр TStringList (примено 80000 строк).
Далее из этого списка удаляются ненужные строки:

while i<Ls.Count do begin
StepIt(LS.Count);
s:=Ls.Strings[i];
if System.Copy(s,1,length(IP))<>IP then
Ls.Delete(i)
else
inc(i)
end;
Занимает этот код безумное время, и, что самое интересное, чем ближе он к концу, тем быстрее он двигается. Как можно оптимизировать этот процесс?


 
Anatoly Podgoretsky   (2002-09-27 16:24) [1]

Ну для начала добавить памяти, поставить P IV 4.7 ггц
потом стоит заняться алгоритмом


 
Song   (2002-09-27 16:25) [2]

IndexOf() вместо If

>>...и, что самое интересное, чем ближе он к концу
Это понятно, чем ближе к концу, тем меньше итемов остаётся.


 
Aleksandr   (2002-09-27 16:32) [3]

2 Song:
IndexOf не пройдет, потому что помимо искомого критерия (IP) в каждой строке истчо туева хуча неизвестной информации.


 
Sectey   (2002-09-27 16:35) [4]

Берешь вручную читаешь из файла в буфер.
Анализируш буфер и пишешь во 2 файл.



 
MBo   (2002-09-27 16:40) [5]

попробуй так
l:=length(ip);
for i:=List.Count-1 downto 0 do
if not CompareMem(Pointer(ip),Pointer(List[i]),l) then
List.Delete(i);


 
Anatoly Podgoretsky   (2002-09-27 16:51) [6]

Размышление вслух, а может не надо все записи гнать в StringList, что бы потом не удалять.

Я так понял денег на память и процессор не хватило, самое время алгоритмом заняться.

Для начала мог бы по подробнее объяснить задачу, привести несколько строк из файла, поъоже это какой то лог, не забыть упомянуть об разделителях строк, кодировке


 
Aleksandr   (2002-09-27 17:00) [7]

2 Anatoly Podgoretsky:
Ну, работает эта программа на мощной машине, где выполняется быстро - медленно она работает у меня, ну и вообще, такой код мне не нравится как яркий показатель моих познаний.

Задача, на самом деле, многим известная: прокси-сервер пишет логи о подключениях.
из этих логов, состоящих из кучи колонок с разделителем-табуляцией:
111.111.1.11 anonymous Mozilla/4.0 (compatible; MSIE 5.01; Windows 98) N 2002-09-26 00:06:40 w3proxy COMPNAME - 222.222.222.2 - 80 - 302 4234 http TCP GET http://333.333.0.3/ - - 407 - - -
, надо отсеять только заданную маску IP-адресов, просуммировать по каждому оставшемуся адресу количество отправленных/полученных байт и закатать это в базу данных. Предусматривается куча опций - все адреса, один адрес, маска, за один день, за период...


 
Aleksandr   (2002-09-27 17:10) [8]

2 MBo:
Скажите, а разве корректно загонять в for изменяемую величину?


 
MBo   (2002-09-27 17:12) [9]

Это начальное значение счетчика, оно потом не изменяется, так что корректно


 
Anatoly Podgoretsky   (2002-09-27 17:23) [10]

Твоя задача с успехом накладывается на ReadLn, только проверь на разделители, кроме того в этом случае трафик можно сразу посчитать для всех ИП


 
Anatoly Podgoretsky   (2002-09-27 17:24) [11]

Aleksandr © (27.09.02 17:10)
Если надо переменное значение, то надо использовать цикл while


 
NickBat   (2002-10-02 12:38) [12]

Если есть огромное желание загонять все именно в StringList, а потом работать именно с ним (как по мне, так лучше при считывании из файла все делать, суммировать в том числе), то делать надо так:

StringList.BeginUpdate;
....
you programm
....
StringList.EndUpdate;


 
Mike Kouzmine   (2002-10-02 13:29) [13]

А не проще сначала загнать в базу, а затем одним запросом удалить не нужное?


 
murzikN   (2002-10-02 13:40) [14]

Обрати внимание на Sectey © (27.09.02 16:35)

Только лучше создай еще один StringList, в него перенеси все, что нужно, а старый освободи.


 
Игорь Шевченко   (2002-10-02 13:49) [15]

Mike Kouzmine (02.10.02 13:29)


> А не проще сначала загнать в базу, а затем одним запросом
> удалить не нужное?


Да-да. И непременно в Oracle...


 
Mike Kouzmine   (2002-10-02 13:56) [16]

Зачем оракл. Они же потом все равно в базу гонят, так не все ли равно? И не надо иронизировать по этому поводу.


 
cpp   (2002-10-02 16:58) [17]

Могу выслать исходники программы по подсчёту траффика по логам MS Proxy, работает достаточно быстро. Насколько я помню. Я всё сначала загнал в память, точнее в строку, и затем посимвольно проанализировал. А StringList отнимит у тебя кучу времени и кучу ресурсов


 
REA   (2002-10-02 17:55) [18]

Мои соображения:
Сделать TStringList, LoadFromFile
Сделать второй List и зарезервировать память, чтобы не перераспределять (не помню как).
Использовать пару BeginUpdate/EndUpdate
Добавлять во второй из первого только необходимые строки
StepIt наверно индикатор? Рисовать индикатор пореже.
И длина IP там вроде переменная.

Есть еще компоненты для быстрой работы со строками не Борландовые.


 
TTCustomDelphiMaster   (2002-10-02 18:11) [19]

Смеркалось...
А ежики все падали и падали :)

PS: Anatoly Podgoretsky предложил самый оптимальный вариант.


 
Polevi   (2002-10-02 18:30) [20]

вариант с базой хорош - создать базу и в базу из лога добавлять только дельту - записи из лога которых в базе еще нет - не придется по сто раз анализировать огромный лог файл
ну а имея базу задача решаеться элементарно

у меня именно так все и работает


 
Polevi   (2002-10-02 18:33) [21]

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


 
Romkin   (2002-10-02 18:36) [22]

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


 
TTCustomDelphiMaster   (2002-10-02 18:47) [23]

еще 2 :)



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

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

Наверх





Память: 0.5 MB
Время: 0.105 c
14-45559
AL2002
2002-09-18 13:41
2002.10.14
У меня ZipMagic стоит


3-45236
dsr
2002-09-20 15:59
2002.10.14
Получение списка полей и таблиц


1-45449
AndreyS
2002-10-03 13:10
2002.10.14
Глобальные переменные и потоки


3-45196
Sherlock99
2002-09-23 10:52
2002.10.14
Перенос заголвков столбцов в DBGrid?


1-45380
Aleksandr
2002-09-27 16:20
2002.10.14
Можно ли как-то оптимизировать работу со StringList?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский