|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Я уже набросал алгоритм. сейчас делаю. Тут по 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2011, 16:00 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авториспользуя проекции не надо будет файл по частям обрабатывать. в том том и дело что придется по частям там логика та же что и при обычной буферизации просто мы пишем не LoadBufferFromFile а MapFileToMemoryAddress но диапазон адресов куда мапить это физическая память совершенно та же что и при выделении буфера стандарным способом просто как только я первый раз услышал про мапинг то так же думал что все будет делаться автоматически и память можно будет выделить любого размера и долго потом пытался понять как же это можно сделать а оказывается никак понятно что если есть желание что-то новое изучить это хорошо ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2011, 17:15 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
если TraceID определяет нужную нам запись то можно просто всегда искать TraceID потом через пробел прочитать этот ид и если он изменился то завершить предыдущую запись и начать следующую так даже лучше не надо назад искать ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2011, 17:25 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсересли 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) Следующий фрагмент файла (файл) ну и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2011, 17:45 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2011, 21:43 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Забавная штука если имею размер буфера Х. При Х+1 получаю OUTOFMEMORY. Так вот если я создам две переменые и помещу в них информацию по объему равную Х, то никаких OUTOFMEMORY я не получаю. Тогда можно обойти ситуацию с разрывом данных в начале N-го фрагмента лога считанного из файла. просто держа 2 переменных strBuffer и strBufferOld. А в strBufferOld держать предидущей фрагмент N-1. О как интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 14:10 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКАAlex_men, section = section & CRLF & line ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''зачем сцеплять если читается сидоров вместо иванова '' не понятно на одной ли строке UserInfo и фамилия '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Прошу прощения не объясню, т.к. это не мой код. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 14:12 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авторимею размер буфера Х. При Х+1 получаю OUTOFMEMORY это подозрительно и чему же равен Х? и как он был найден? теоретически конечно возможна ситуация когда в памяти есть два свободных маленьких куска но один большой из них сложить нельзя но вот только попасть в границу те угадать Х можно только в цикле увеличивая Х на 1 и выделять и освобождать память каждый раз ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 14:41 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авторможно обойти ситуацию с разрывом данных в начале N-го фрагмента лога считанного из файла. просто держа 2 переменных strBuffer и strBufferOld. А в strBufferOld держать предидущей фрагмент N-1 смотря как сканировать буфер в моем примере так делать нельзя тк буфер целиком должен содержать две записи если это условие не используется то размер буфера надо брать большим только из тех соображений. что скорость чтения с диска гораздо выше когда буфер большого размера. по крайней мере я так измерил ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 14:46 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
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] ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 15:29 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Нашел народным способом тыка. думаю здесь играет размер стринг, а не памяти в целом я пробовал поставить Х=98 000 000. если ставил 99 000 000 то уже шло OutOfMemory. При этом две переменные спокойно съедают куски текста по 98 000 000. Возможно тут дело в типе переменной и размерности типа. Хотя по хелпу судя string должно вмещать в себя порядка 2 биллионов символов. Ну с учетом ASCII и не ASCII порядка биллиона. Сижу ковыряюсь в этом направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 15:37 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, аааа Понял Вас. Был введен в заблуждение разработчикаами и соответственно выдал не совсем верную информацию тут на форуме. После первичного разбора пачки логов наткнулся на несколько неприятных для меня вещей 1) Искомый фрагмент лога может переплетаться с другими фрагментами лога, не имеющими отношения к Иванову. 2) Как правило в таких (разбитых на куски) фрагментах присутствует не UserInfo, а NewSessionUserInfo. Таким образом поиск значительно усложняется. Во первых контроль надо делать еще и с учетом TraceId для выделения нужного мне фрагмента, во вторых выделение TraceId нужно делать с контролем по 2-м параметрам UserInfo и NewSessionUserInfo и в третьих нужно учитывать возможную фрагментацию искомого фрагмента лога (извиняюсь за тафталогию). С чем и ковыряюсь сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 15:48 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, а вот пытливый ум не дает мне покоя. В хелпе написано: "String - предназначен для хранения строковой (символьной) информации, т.е. попросту говоря - текста. Может хранить до 2 Гб. текста. Символ для обозначения - "$". " Классно, на деле порядка 100 мб и то в зависимости от запущенных на компе приложений.Гдето тут хитрая галочка не иначе ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 16:11 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Интересно а ктонибудь умудрялся впихнуть в стринг 2 Гб текста? Меня в принципе и один устроил бы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 17:03 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авторможет хранить до 2 Гб. текста это значит что размер строки ничем не ограничен в 32 бита может войти размер 4Гб но бейсик использует только знаковые типы те останется 31 бит или 2Гб ну а чтобы 2 Гб выделить надо их иметь свободными не знаю может на компе с 3Гб памяти и можно выделить строку большую чем 1Гб но кроме этой строки в проге есть еще данные которые тоже место занимают ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 17:10 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Я понимаю, что на компе есть еще приложения и т.п. и т.д. Но вот вопрос пусть есть комп с 2Гб оперативы, пусть гиг отведен на систему, еще 500 м отдадим прочим прогам а как использовать оставшиеся 500. Или тут командует мелкософт и немытыми руками лезть не получится? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 17:33 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, уж больно геморойный поиск получается при чтении покускам. Но походу вариантов нет. Засучим рукова и приступим. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2011, 17:34 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Alex_men, уф сделал, в общем разбор гига теперь стал минута 45 сек. зато ничего лишнего все по теме никаких вырваных кусков и обрезанных строк. Спасибо Вам всем за помощь. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2011, 12:08 |
|
|
start [/forum/topic.php?fid=60&gotonew=1&tid=2158182]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
96ms |
get topic data: |
11ms |
get first new msg: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 364ms |
total: | 570ms |
0 / 0 |