powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
18 сообщений из 168, страница 7 из 7
Работа с большими текстовыми файлами.
    #37579975
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Я уже набросал алгоритм. сейчас делаю. Тут по TraceID четко выбирается нужные секции. Границы думаю определять от vbCrLf начала строки содержащей нужный TraceID до [yyyy.mm.dd_ (это можно из названия файла брать). Вот дальше примерчик свалки которую отобрала сейчас программа, проверил с точностью до запятой то что в исходном файле лога.

а насчет проекции в памяти. Это вопервых мне интересно освоит, а во вторых думаю позволит мне компенсировать усложнение алгоритма парсинга тем что не надо будет файл по частям обрабатывать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->IncomingTime\16

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->IncomingData\1071

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->ThreadID\8

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->RequestExecuteStart\16

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->RequestInfo\23

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->CheckUserInfo\137

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->UserInfo\27
|10990019|Романов

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->TraceParams\142

[2011.08.18 10:57:36:176][TraceID: LFDFLL8899IB1O]->StartExecuteTask\32

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->IncomingTime\16

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->IncomingData\552

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->ThreadID\8

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->RequestExecuteStart\16

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->RequestInfo\23

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->CheckUserInfo\137

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->UserInfo\20
|101450077|Сидоров

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->TraceParams\93

[2011.08.18 10:57:36:192][TraceID: 8LW3K8SKEUXPL5]->StartExecuteTask\37

[2011.08.18 10:57:36:238][TraceID: 8LW3K8SKEUXPL5]->EndExecuteTask\37

[2011.08.18 10:57:36:238][TraceID: 8LW3K8SKEUXPL5]->RequestExecuteEnd\16

[2011.08.18 10:57:36:238][TraceID: 8LW3K8SKEUXPL5]->OutgoingData\4099

[2011.08.18 10:57:36:238][TraceID: 8LW3K8SKEUXPL5]->OutgoingTime\16

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->IncomingTime\16

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->IncomingData\521

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->ThreadID\8

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->RequestExecuteStart\16

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->RequestInfo\23

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->CheckUserInfo\137

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->TraceParams\7

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->StartExecuteTask\37

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->EndExecuteTask\37

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->RequestExecuteEnd\16

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->OutgoingData\206

[2011.08.18 10:57:39:207][TraceID: ESYID26QJ6N4YW]->OutgoingTime\16

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->IncomingTime\16

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->IncomingData\1220

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->ThreadID\8

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->RequestExecuteStart\16

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->RequestInfo\23

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->CheckUserInfo\137

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->TraceParams\7

[2011.08.18 10:57:39:379][TraceID: EPVI5K4Y1SGEVJ]->StartExecuteTask\36

[2011.08.18 10:57:39:816][TraceID: LFDFLL8899IB1O]->EndExecuteTask\32

[2011.08.18 10:57:39:895][TraceID: LFDFLL8899IB1O]->RequestExecuteEnd\16

[2011.08.18 10:57:39:895][TraceID: LFDFLL8899IB1O]->OutgoingData\2695

[2011.08.18 10:57:39:895][TraceID: LFDFLL8899IB1O]->OutgoingTime\16

[2011.08.18 10:57:39:895][TraceID: EPVI5K4Y1SGEVJ]->NewSessionUserInfo\292
SID = 2MVT8YHBALA8HCEEJABM3QN0J6TN28
UserKey = 100000286
ARMName = Иванов
IDs = 100022338
[2011.08.18 10:57:39:895][TraceID: EPVI5K4Y1SGEVJ]->TraceParams\19

[2011.08.18 10:57:40:020][TraceID: EPVI5K4Y1SGEVJ]->EndExecuteTask\36

[2011.08.18 10:57:40:020][TraceID: EPVI5K4Y1SGEVJ]->RequestExecuteEnd\16

[2011.08.18 10:57:40:020][TraceID: EPVI5K4Y1SGEVJ]->OutgoingData\5759

[2011.08.18 10:57:40:020][TraceID: EPVI5K4Y1SGEVJ]->OutgoingTime\16

...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37580234
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авториспользуя проекции не надо будет файл по частям обрабатывать.


в том том и дело что придется по частям там логика та же что и при обычной буферизации
просто мы пишем не LoadBufferFromFile а MapFileToMemoryAddress но диапазон адресов куда мапить это физическая память совершенно та же что и при выделении буфера стандарным способом

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

понятно что если есть желание что-то новое изучить это хорошо
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37580268
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если TraceID определяет нужную нам запись то можно просто всегда искать TraceID
потом через пробел прочитать этот ид и если он изменился то завершить предыдущую запись и начать следующую
так даже лучше не надо назад искать
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37580321
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсересли TraceID определяет нужную нам запись то можно просто всегда искать TraceID
потом через пробел прочитать этот ид и если он изменился то завершить предыдущую запись и начать следующую
так даже лучше не надо назад искать

Все равно надо проверять кто сессию с этим TraceID открыл Иванов , Петров или Сидоров. Так что алгоритм делаю пока такой

1) Найти Иванова. Если Да то пункт 2, если нет то пункт 10
2) откатываюсь InStrRev на ближайший ]->UserInfo
3) откатываюсь InStrRev на [TraceId
4) определяю значение TraceId для данного пользователя для данной сессии
5) дальше ищу InStrRev на [TraceId тра-та-та]->IncomingTime
6) Нахожу начало этой строки
7) нахожу InStr на ближайший [YYYY.MM.DD
8) промежуток между 6 и 7 забрасываю в StrFound
9) Ищу следующее вхождение [TraceId тра-та-та]->. Если нахожу то повторение с пункта 6, если нет то пункт 1
10) Следующий фрагмент файла (файл)
ну и т.д.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37581344
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men,

set fso = CreateObject("Scripting.FileSystemObject")
set fin = fso.OpenTextFile(Input_File_Name)
set fout = fso.CreateTextFile(Output_File_Name, True)
section = ""
hasUser = 0
do while not fin.AtEndOfStream
line = fin.ReadLine
if instr(line, ">IncomingTime") > 0 then
if hasUser=1 then
fout.Write section
end if
section = ""
hasUser=0
elseif instr(line, ">UserInfo") > 0 then
if instr(line, "john doe") > 0 then
hasUser = 1
else
hasUser=2
end if
end if
if nasUser<2 then
section = section & CRLF & line
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''зачем сцеплять если читается сидоров вместо иванова
'' не понятно на одной ли строке UserInfo и фамилия
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
endif
loop
fin.close
fout.close
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583021
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Забавная штука если имею размер буфера Х. При Х+1 получаю OUTOFMEMORY. Так вот если я создам две переменые и помещу в них информацию по объему равную Х, то никаких OUTOFMEMORY я не получаю. Тогда можно обойти ситуацию с разрывом данных в начале N-го фрагмента лога считанного из файла. просто держа 2 переменных strBuffer и strBufferOld. А в strBufferOld держать предидущей фрагмент N-1. О как интересно.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583027
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКАAlex_men,


section = section & CRLF & line
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''зачем сцеплять если читается сидоров вместо иванова
'' не понятно на одной ли строке UserInfo и фамилия
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Прошу прощения не объясню, т.к. это не мой код. :)
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583102
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторимею размер буфера Х. При Х+1 получаю OUTOFMEMORY


это подозрительно
и чему же равен Х?
и как он был найден?

теоретически конечно возможна ситуация когда в памяти есть два свободных маленьких куска но один большой из них сложить нельзя
но вот только попасть в границу те угадать Х можно только в цикле увеличивая Х на 1 и выделять и освобождать память каждый раз
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583115
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторможно обойти ситуацию с разрывом данных в начале N-го фрагмента лога считанного из файла. просто держа 2 переменных strBuffer и strBufferOld. А в strBufferOld держать предидущей фрагмент N-1


смотря как сканировать буфер
в моем примере так делать нельзя тк буфер целиком должен содержать две записи
если это условие не используется то размер буфера надо брать большим только из тех соображений. что скорость чтения с диска гораздо выше когда буфер большого размера. по крайней мере я так измерил
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583265
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men,

не вижу >UserInfo
----------------------------пример 1--------------------
2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->IncomingData\706
FЪКД2 TWDPWCC8R36HNU P Connection: Keep-Alive
Accept: text/html, application/xhtml+xml, */*
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU
Cookie: exp_path=C%3A%5CUsers%5C%u0412%u0430%u0434%u0438%u043C%5CDesktop; __utma=179010226.226380545.1311577166.1321904062.1322427283.33; __utmz=179010226.1311577166.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=179010226.1.10.1322427283; SID=6a58efcbb44bba88asdb9bb087; hotlog=1; __utmc=179010226
Host: www.тра-та-та.ru
Referer: http://www.тра-та-та.ru/
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; BOIE9;RURU)
T=R_Loader.Load7 # RequestInfo=12.16.1.5|12.16.1.9 ccSITE=R
----------------------пример 2---------------------------------------------------------------------------
2011.08.18 10:57:39:895][TraceID: EPVI5K4Y1SGEVJ]->NewSessionUserInfo\292
SID = 2MVT8YHBALA8HCEEJABM3QN0J6TN28
UserKey = 100000286
ARMName = Иванов ----------------------строка не с UserInfo
IDs = 100022338

[/SRC]
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583290
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Нашел народным способом тыка. думаю здесь играет размер стринг, а не памяти в целом
я пробовал поставить Х=98 000 000. если ставил 99 000 000 то уже шло OutOfMemory. При этом две переменные спокойно съедают куски текста по 98 000 000. Возможно тут дело в типе переменной и размерности типа.

Хотя по хелпу судя string должно вмещать в себя порядка 2 биллионов символов. Ну с учетом ASCII и не ASCII порядка биллиона. Сижу ковыряюсь в этом направлении.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583325
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,

аааа Понял Вас. Был введен в заблуждение разработчикаами и соответственно выдал не совсем верную информацию тут на форуме.
После первичного разбора пачки логов наткнулся на несколько неприятных для меня вещей
1) Искомый фрагмент лога может переплетаться с другими фрагментами лога, не имеющими отношения к Иванову.
2) Как правило в таких (разбитых на куски) фрагментах присутствует не UserInfo, а NewSessionUserInfo.

Таким образом поиск значительно усложняется. Во первых контроль надо делать еще и с учетом TraceId для выделения нужного мне фрагмента, во вторых выделение TraceId нужно делать с контролем по 2-м параметрам UserInfo и NewSessionUserInfo и в третьих нужно учитывать возможную фрагментацию искомого фрагмента лога (извиняюсь за тафталогию).

С чем и ковыряюсь сейчас.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583384
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

а вот пытливый ум не дает мне покоя. В хелпе написано:
"String - предназначен для хранения строковой (символьной) информации, т.е. попросту говоря - текста. Может хранить до 2 Гб. текста. Символ для обозначения - "$". "

Классно, на деле порядка 100 мб и то в зависимости от запущенных на компе приложений.Гдето тут хитрая галочка не иначе
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583529
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно а ктонибудь умудрялся впихнуть в стринг 2 Гб текста? Меня в принципе и один устроил бы :)
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583545
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторможет хранить до 2 Гб. текста


это значит что размер строки ничем не ограничен
в 32 бита может войти размер 4Гб но бейсик использует только знаковые типы те останется 31 бит или 2Гб

ну а чтобы 2 Гб выделить надо их иметь свободными
не знаю может на компе с 3Гб памяти и можно выделить строку большую чем 1Гб
но кроме этой строки в проге есть еще данные которые тоже место занимают
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583610
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Я понимаю, что на компе есть еще приложения и т.п. и т.д. Но вот вопрос пусть есть комп с 2Гб оперативы, пусть гиг отведен на систему, еще 500 м отдадим прочим прогам а как использовать оставшиеся 500. Или тут командует мелкософт и немытыми руками лезть не получится?
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37583613
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

уж больно геморойный поиск получается при чтении покускам. Но походу вариантов нет. Засучим рукова и приступим.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37598750
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

уф сделал, в общем разбор гига теперь стал минута 45 сек. зато ничего лишнего все по теме никаких вырваных кусков и обрезанных строк. Спасибо Вам всем за помощь. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!
...
Рейтинг: 0 / 0
18 сообщений из 168, страница 7 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]