Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#61: 2009-10-30 23:25:46 ЛС | профиль | цитата
Tad писал(а):
попробуй и такую

Мдааа... А не имеет ли смысл добавить такую возможность и нам для работы со строками в файле, те, работу с TextFile
------------ Дoбавленo в 23.50:
Хотя, я проверил свою и схему Tad-a на своем компе, приведя их к однотипным выходным контролам и фильтру поиска. Скажу, что результат не в пользу схемы Tad-a. Файл 1.5 Mb: Схема Tad-a -- 835 мсек, моя схема -- 748 мсек.

Так что, TextFile проходил мимо, а так и должно быть, надо было приводить к бинарному чтению
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#62: 2009-10-30 23:57:31 ЛС | профиль | цитата
Я за!
Окончательный вариант процедуры:

#pas
procedure THiAsmClass.doSearch;
var
F: TextFile;
S,t: string;
begin
t:= ReadString(Data, text);
AssignFile(F,ReadString(Data, filename));
Reset(F);
While Eof(F)<> True do
begin
Readln(F, S);
If pos(t,s)<> 0 then _hi_onEvent(onSearch, S);
end;
CloseFile(F);
end;
Ну не знаю. Я свою проверял на 76 Mb (800 тысяч строк) за 1.2 S
То же в SQLite выбирает ~ за 10 S

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#63: 2009-10-30 23:58:46 ЛС | профиль | цитата
Да, еще чего подумал -- парсить файл лога -- это хорошо, а не проще мониторить этот файл на ходу, читать добавку и распихивать данные на ходу в каждодневную базу. Я бы так и сделал
------------ Дoбавленo в 23.59:
Tad, слабое быстродействие прямого кода, меня настораживает
------------ Дoбавленo в 00.13:
Проверил обе схемы на этом же файле при отключенном контроле вывода. Прирост схемы Tad-a очень незначительный 24 мсек против моих 26 мсек

Тестовые схемы:

Моя



Add(MainForm,94467,399,378)
{
Width=750
Height=299
Caption=""
}
Add(Button,4481738,168,175)
{
Left=20
Top=235
link(onClick,1555007:doStart,[])
}
Add(Thread,1555007,224,175)
{
Delay=0
FastStop=0
link(onExec,13019582:doEvent1,[])
}
Add(Hub,5019261,280,287)
{
OutCount=5
link(onEvent1,6468069:doOff,[(324,293)(324,349)])
link(onEvent2,15640483:doStart,[(310,300)(310,377)])
link(onEvent3,344370:doConvert,[])
link(onEvent4,15640483:doStop,[(303,314)(303,384)])
link(onEvent5,6468069:doOn,[(318,321)(318,356)])
}
Add(LED,6468069,343,336)
{
Left=615
Top=235
Width=115
Height=20
Shape=1
}
Add(TimeCounter,15640483,343,371)
{
link(onStop,94467:doCaption,[])
}
Add(SharedStream,9929879,343,196)
{
FileName="log1.txt"
CoreName="Log"
PageMem=1600
Point(Position)
link(onOpen,5019261:doEvent1,[(387,202)(387,248)(268,248)(268,293)])
}
Add(Convertor,344370,343,301)
{
Mode=11
link(onResult,10513845:doEvent1,[])
link(Data,9929879:Stream,[])
}
Add(StrList,2597292,476,217)
{
Point(doGetString)
Point(onGetString)
}
Add(Edit,11092326,546,350)
{
Left=155
Top=235
Width=130
Text="serial"
}
Add(Hub,13019582,280,175)
{
OutCount=3
link(onEvent1,9209952:doClear,[(677,181)(677,321)])
link(onEvent2,2279432:doData,[(460,188)(460,405)])
link(onEvent3,9929879:doOpen,[(318,195)(318,202)])
}
Add(ArrayEnum,16021318,490,308)
{
link(onItem,2886579:doSearch,[])
link(Array,2597292:Array,[])
}
Add(Hub,10513845,406,301)
{
link(onEvent1,2597292:doText,[(439,307)(439,244)])
link(onEvent2,16021318:doEnum,[])
}
Add(BlockFind,2886579,630,308)
{
EndBlock=":"
Point(doStartBlock)
link(onSearch,9209952:doAdd,[])
}
Add(DoData,2279432,546,399)
{
link(onEventData,2886579:doStartBlock,[(589,405)(589,321)])
link(Data,11092326:Text,[])
}
Add(ListBox,9209952,693,308)
{
Left=10
Top=10
Width=720
Height=215
link(Str,16021318:Item,[(699,294)(534,294)(534,352)(496,352)])
}


Приведенная Tad-a



Add(MainForm,94467,343,322)
{
Width=750
Height=299
Caption=""
}
Add(Button,4481738,126,224)
{
Left=20
Top=235
link(onClick,1555007:doStart,[])
}
Add(Thread,1555007,175,224)
{
Delay=0
FastStop=0
link(onExec,5019261:doEvent1,[])
}
Add(Hub,5019261,224,224)
{
OutCount=6
link(onEvent1,9209952:doClear,[(400,230)(400,258)])
link(onEvent2,6468069:doOff,[(268,237)(268,293)])
link(onEvent3,15640483:doStart,[(261,244)(261,321)])
link(onEvent4,3918115:dosearch,[])
link(onEvent5,15640483:doStop,[(253,258)(253,328)])
link(onEvent6,6468069:doOn,[(247,265)(247,300)])
}
Add(LED,6468069,287,280)
{
Left=615
Top=235
Width=115
Height=20
Shape=1
}
Add(TimeCounter,15640483,287,315)
{
link(onStop,94467:doCaption,[])
}
Add(Edit,11092326,343,182)
{
Left=155
Top=235
Width=130
Text="serial"
}
Add(ListBox,9209952,427,245)
{
Left=10
Top=10
Width=720
Height=215
}
Add(InlineCode,3918115,343,245)
{
WorkPoints=#8:dosearch|
EventPoints=#8:onsearch|
DataPoints=#4:text|8:filename|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|30: text,filename:THI_Event;|25: onSearch:THI_Event;|6: |53: procedure doSearch(var Data:TData; index:word);|5: end;|0:|14:implementation|0:|31:procedure THiAsmClass.doSearch;|3:var|14: F: TextFile;|14: S,t: string;|5:begin|30: t:= ReadString(Data, text);|45: AssignFile(F,ReadString(Data, filename)); |12: Reset(F);|26: While Eof(F)<> True do|9: begin|18: Readln(F, S);|53: If pos(t,s)<> 0 then _hi_onEvent(onSearch, S); |8: end;|17: CloseFile(F);|4:end;|0:|0:|0:|15:{var f:PStream;|13: t:string;|31: buf:array[0..4096] of char;|18: len,p:integer;|5:begin|31: t := ReadString(Data, text);|54: f := NewReadFileStream(ReadString(Data, filename));|35: fillchar(buf, sizeof(buf), );|21: len := length(t); |31: while f.position < f.size do|10: begin|52: copymemory(@buf[0], @buf[4096-1 - len], len);|48: p := f.read(buf[len], sizeof(buf) - len);|22: //buf[p] := #0;|24: p := pos(t, buf);|21: while p > 0 do|14: begin|45: _hi_onEvent(onSearch, f.position);|39: p := posex(t, buf, p + len);|13: end;|9: end;|10: f.free;|6:end; }|0:|4:end.|
link(onsearch,9209952:doAdd,[])
link(text,11092326:Text,[])
link(filename,5179944:Value,[(356,223)(391,223)])
}
Add(Memory,5179944,385,182)
{
Default=String(log1.txt)
}

------------ Дoбавленo в 00.18:
Вот что бы я добавил точно, так это загрузку StrList-a прямо из стрима, а ведь такие функции есть и записи и чтения
Пожалуй, я сейчас попробую, лишним не будет
карма: 22

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#64: 2009-11-01 03:43:10 ЛС | профиль | цитата
Последние изыскания в области оптимизации схемы без использования IC


Add(MainForm,94467,385,343)
{
Width=367
Height=75
Caption="Log_Parser"
}
Add(Button,4481738,203,224)
{
Left=5
Top=10
TabOrder=-1
Caption="Parse"
link(onClick,1555007:doStart,[])
}
Add(Thread,1555007,245,224)
{
Delay=0
FastStop=0
link(onExec,5019261:doEvent1,[])
}
Add(Hub,5019261,287,224)
{
OutCount=9
link(onEvent1,13462740:doClear,[(630,230)(630,405)])
link(onEvent2,2279432:doData,[(445,237)(445,405)])
link(onEvent3,2091159:doString,[(439,244)(439,461)])
link(onEvent4,6468069:doOff,[(330,251)(330,314)])
link(onEvent5,15640483:doStart,[(325,258)(325,342)])
link(onEvent6,7652695:doOpen,[])
link(onEvent7,7652695:doClose,[])
link(onEvent8,15640483:doStop,[(320,279)(320,349)])
link(onEvent9,6468069:doOn,[(315,286)(315,321)])
}
Add(LED,6468069,343,301)
{
Left=335
Top=10
Width=20
Height=20
Shape=1
ColorBlick=255
}
Add(TimeCounter,15640483,343,336)
{
link(onStop,94467:doCaption,[])
}
Add(StrList,2597292,462,252)
{
link(onChange,77592:doEnum,[(503,258)(503,237)(451,237)(451,314)])
}
Add(Edit,11092326,525,357)
{
Left=65
Top=10
Width=130
Text="serial"
}
Add(BlockFind,2886579,581,392)
{
Point(doStartBlock)
Point(doEndBlock)
link(onSearch,13462740:doAdd,[])
}
Add(DoData,2279432,525,399)
{
link(onEventData,2886579:doStartBlock,[])
link(Data,11092326:Text,[])
}
Add(FileStream,7652695,343,259)
{
FileName="log1.txt"
link(onLoad,32675:doConvert,[])
}
Add(Convertor,32675,385,259)
{
Mode=11
link(onResult,2597292:doText,[(428,265)(428,279)])
}
Add(ArrayEnum,77592,476,308)
{
link(onItem,2886579:doSearch,[(570,314)(570,398)])
link(onEndEnum,13462740:doSave,[(625,321)(625,433)])
link(Array,2597292:Array,[])
}
Add(StrList,13462740,644,392)
{
FileName="log2.txt"
link(Str,77592:Item,[(650,350)(482,350)])
}
Add(Edit,11996385,476,413)
{
Left=200
Top=10
Width=130
Text="dur"
}
Add(FormatStr,2091159,476,455)
{
DataCount=1
Mask="%1:"
link(onFString,2886579:doEndBlock,[(570,461)(570,412)])
link(Str1,11996385:Text,[])
}

Парсирование файла лога размером 117 Мб с записью в файл выборки присходит за 2,8 сек (на моем компе). Скорость выпонения, практически, совпадает с IC, приведенное Tad-ом (его схема тоже выдала в том же режиме 2,8 сек, но при одном условии поиска)
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#65: 2009-11-01 10:04:09 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2025-01-09 13:16:28
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#66: 2009-11-01 14:26:42 ЛС | профиль | цитата
nesco писал(а):
Последние изыскания в области оптимизации схемы без использования IC

Прицепи к первой StrList.Count Label и посмотри, что там сидят весь твой Log на 117 Мб (загрузка памяти) + загрузка процессора 54%
С моей IC читается ровно по одной строке (не Мб) и загрузка проца 33%

И зачем платить больше

Не хочешь IC - на компонент.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1searchintextfile.rar [1.4KB] [137]
Разработчик
Ответов: 26163
Рейтинг: 2127
#67: 2009-11-01 14:39:32 ЛС | профиль | цитата
Tad писал(а):
И зачем платить больше

Очень медленно для IC, это не пойдет. Прирост должен быть, минимум, процентов 50, что я не вижу
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#68: 2009-11-01 14:45:35 ЛС | профиль | цитата
nesco писал(а):
Парсирование файла лога размером 117 Мб
nesco, а сколько в нем строк ?
А вообще, линеечка компонент для работы чисто с текстовыми файлами не помешала бы.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#69: 2009-11-01 17:30:35 ЛС | профиль | цитата
Tad писал(а):
а сколько в нем строк ?

1143680 строк
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#70: 2009-11-01 18:54:00 ЛС | профиль | цитата
Солидно. И строки не из одной буквы
Попробуй своим методом найти что нибудь в последнем Elements.sql с SVN
Нужно добавлять в конвертор TextUnix->TextWindows и наоборот.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#71: 2009-11-01 19:09:09 ЛС | профиль | цитата
Tad писал(а):
Попробуй своим методом найти что нибудь в последнем Elements.sql с SVN

Гы, гы -- размер внушет. Надо просто Replace поставит 10 -> 1310 и нафиг там конвертор не впал
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#72: 2009-11-01 19:46:49 ЛС | профиль | цитата
nesco писал(а):
Надо просто Replace поставит
Два Replace или автомат определения какой файл unix или windows, чтобы в скомпилированой проге руками замену не делать.

nesco писал(а):
1143680 строк
а в своей схеме ты выигрываешь в скорости только потому, что грузишь файл в память (StrList) и потом работаешь с памятью. И больше ничем.
Обыкновенный StrList.doLoad сработает также.
И размер парсированного файла зависит от размера свободной памяти.
Правда сейчас, при Gb-ных размерах, это большого значения не имеет.

Проверил на буке с 128 Мб памяти (свободной около 30 Мб) - полный затык и выход только через кнопку Reset .
Я же читаю по одной строке и мне по барабану размер памяти. Та же бука свободно отпарсила весь мой тестовый файл на 76 Мб.
Быстро и без проблем.



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Гость
Ответов: 17029
Рейтинг: 0
#73: 2009-11-02 02:20:48 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2025-01-09 13:16:28
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#74: 2009-11-02 02:27:38 ЛС | профиль | цитата
А давай послушаем начальника транспортного цеха -- почему за пять лет никто не добавил стандартных функци Write и Read для работы с файловыми переменными, хотя бы, для текста И давай договоримся, на меня больше не валить, а решать коллегиально такие вопросы
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#75: 2009-11-02 03:02:13 ЛС | профиль | цитата
nesco, да не валю я на тебя.
Просто поделился своими изысками и хотел услышать твое мнение.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)