|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсеркажется понял но тогда White Owl никак не поможет он же не знает всех ивановых петровых и тд опять же возникает вопрос из одного огромного файла лога берется только иванов? и что для каждого пользователя свой лог? если это не так те один лог содержит много пользователей то логично делать наоборот те найти userinfo посмотреть для кого если надо делать для него отчет то сделать иначе пропустить Ну Иванова я просто в форме ввожу. И действительно мне нужно получить информацию что сделал Иванов за указанный в запросе период. Лог для всех пользователей один. Если честно не понимаю почему логичней искать UserInfo? Получается больше операций в программе. В Вашем варианте 1) найти USERINFO 2) проверить его содержимое 3) найти начало фрагмента лога 4) найти конец фрагмента лога. Скажем так в USERINFO содержится информация которая мне позволит точно идентифицировать пользователя, помимо ФИО еще ID в системе. Таким образом мне как раз достаточно посмотреть сочитание Иванов +ID. С VB все просто. когда то давно контора купила VisualStudio 6. Сотрудник под которого покупалось, считал что ему и АКСеса хватит. Потом он Ушел и мне в наследство досталась куча программ и базок разного калибра на Аксесе. Я их поддерживал тихонечка осваивая VBA. А последнее время пошли задачки под которые Аксесс явно маловат да и коды открытыми держать нехотелосьбы. Вот я и перешел на VB6. Говорить что мне нужна более современная среда говорю, но в ответ предлагают 2010 Аксес ну или что там есть по лицензии. :) а могли и в опенофис послать :) А пока начальству капаю узнаю много интересного и полезного. А ставить пиратку не могу слишком велика вероятность проверки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2011, 01:18 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
А если поставить SQL Express? Я не думаю. что объемы ваших данных превысят ограничения бесплатной версии. Раз вы все равно вынуждены (и способны) осваивать новые срЕды - то почему бы сразу не заняться импортом и анализом с точки зрения СУБД? Тем более, что с акцессом вы знакомы. А юзвери будут спокойно получать из базы любые выборки стандартными средствами (например, через ADODB) себе в любимый WORD... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2011, 03:57 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
AndreTM, Да я и с SQL малость знаком :) Только работа с базой данных повышает время анализа как минимум на время импорта данных из файлов. Старый вариант программы примерно так и работал. Только чтобы не тратить время на импорт я подлинковал текстовый файл с именем tmp.log в виде таблицы. и каждый новый файл подкладывал на место проанализированного. Но запрос с условием Код: vbnet 1.
отрабатывает примерно с той же скоростью что и построчное чтение из файла. А вот в гибкости программа теряет. т.к. Надо при смене место положения программы на машине либо перелинковывать файл либо располагать программу по тем же путям. Ну и самый главный минус время. Сейчас с помощью ребят анализ идет 1-2 секунды. Осталось только проход по большим файлам оптимизировать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2011, 18:39 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Alex_menСтруктура приведенная ниже соответствует выполнению одного действия пользователем. И всегда одинаково начинается с >IncomingTime и заканчивается всегда >OutgoingTime.Между OutgoingTime и IncomingTime могут быть строки? Может информация о двух юзерах быть перемешанной? Тот awk скрипт который я публиковал идеально отрабатывает на примере. Если он не работает на реальном файле, значит реальный файл отличается от примера. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2011, 18:48 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
White OwlAlex_menСтруктура приведенная ниже соответствует выполнению одного действия пользователем. И всегда одинаково начинается с >IncomingTime и заканчивается всегда >OutgoingTime.Между OutgoingTime и IncomingTime могут быть строки? Да. После строки содержащей OutgoingTime идет строка с цифровым значением даты и времени. Потом идет пустая строка между строками. именно поэтому я для определения конца фрагмента использую начало строки содержащей IncomingTime следующей секции White OwlМожет информация о двух юзерах быть перемешанной? нет программа в лог пишет законченные фрагменты. Так же как и разрыв в логе возможен только при каком то аварийном завершении работы системы в целом. например при отключении питания сервера. White OwlТот awk скрипт который я публиковал идеально отрабатывает на примере. Если он не работает на реальном файле, значит реальный файл отличается от примера. Возможно я что то не так сделал. Просто сейчас я посчитал что параллельное изучение AWK и написание программы замедлит достижение результата. AWK я скачал вместе с документацией. для последующего изучения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2011, 22:05 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
не по основной теме Access 1 Access ведь позволяет создавать mde файлы а в них в нет исходного кода 2 можно создать связанную таблицу не только из родного mdb но и подключить базу sql server разница только в параметрах подключения 3 Более удобного и быстрого способа построения интерфейса программы чем в Access я не встречал хотя может они и есть 4 конечно для нашей задачи любая бд не помощник .net 1 Visual Studio Express SqlServer Express вроде бы бесплатные и любой может скачать их с микрософта 2 Имеем новую платформу с очень большими возможностями 3 Изучать ее более перспективно чем VB 4 Вообщем при возможности этим стоит заняться 5 наверное для нашей задачи .net не помощник по поводу парсера сегодня у меня вряд ли получится посмотреть что-то но завтра хочу еще кое-что посмотреть на текущий момент я сделал следующие открытия 1 я предложил strBuffer as String заменить на bytBuffer() as Byte для экономии памяти но оказалось 2 память конечно сэкономилась и можно в два раза больший буфер выделить 3 InStrB медленней в три раза чем InStr 4 InStrRevB отсутствует парсинг заружая файл по частям 1 я пока еще не все посмотрел 2 бейсик цикл For lngIndex = 1 to 1 000 000 000 делает медленно а это как раз гигабайт 3 читая по кускам мы увеличиваем количество вызовов функции InStr те если у нас есть 10 Мб а в них только две записи удовлетворяющих критерию поиска и размер каждой записи 1МБ если все 10МБ загружены в память то за 2 вызова InStr (только две записи удовлетворяют поиску) мы отсканируем весь файл 10Мб а теперь посмотрим что будет если будем читать файл кусками по 1Мб прочитали 1 Мб вызвали InStr и так десять раз результат поиска тот же но InStr вызывалась в пять раз больше раз 4 у меня подозрение что увеличение количества вызовов функции InStr может существенно замедлить программу как раз это я и собираюсь проверить 5 именно поэтому когда мы ищем строку мы ищем самую фильтрующую подстроку в первую очередь те первой надо искать строку иванов иван иванович и лучше поискать потом назад и вперед от найденной позиции но если таки фамилий целый список тогда получается что лучше искать по UserInfo если записей с UserInfo существенно меньше чем всех записей а если UserInfo почти в каждой записи тогда надо просто искать IncomingTime OutgoingTime формат файла лога 1 признаюсь до сих пор не я уверен что правильно понимаю формат файла лога 2 мне это не важно а вот Owl для написания правильного запроса необходимо 3 когда я создал свой тестовый файл и прогнал gawk который дал Owl у меня все нашлось и быстро 4 я gawk синтаксис не смотрел пока не было времени потому в gawl я не советчик 5 предлагаю написать здесь четкий алгоритм того что надо найти и куда этого в итоге будет выгружено 6 чтобы любой мог прочитав этот алгоритм мог сразу написать прогу парсера и она оказалось верной 7 понятно какие-то специфические действия не нужны пример алгоритма 1 из файла source.txt размером 1200 МБ извлекаются записи и помещаются в файл destination.txt 2 размер каждой записи не превышает 10Мб (а может он вообще не ограничен) 3 запись удовлетворяющая критерию поиска находится так 4 обозначения <символ новой строки> <cr> <любое количество любых символов> <*> 5 начало записи это строка <cr><*>IncomingTime<*><cr> 6 конец записи это строка <cr><*>OngoingTime<*><cr><*><cr> (после строки OngoingTime идет еще одна строка) 7 запись содержит <cr><*>UserInfo<*><cr><*>Иванов<*>Иван<*>Иванович<*><cr> вот так я понимаю алгоримт поиска который нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2011, 16:04 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсерне по основной теме Access 1 Access ведь позволяет создавать mde файлы а в них в нет исходного кода 2 можно создать связанную таблицу не только из родного mdb но и подключить базу sql server разница только в параметрах подключения 3 Более удобного и быстрого способа построения интерфейса программы чем в Access я не встречал хотя может они и есть 4 конечно для нашей задачи любая бд не помощник В mde код есть, только он не доступен для редактирования. А посмотреть его очень даже можно. и Работает mde быстрее , чем Mdb. А так собственно никакой разницы. Подключение аксеса к базам это я знаю. У меня есть несколько прогрммок, база для которых не на mdb а на sql вертится (я даже как то к лотусу ради эксперимента цеплялся). Ну по построению интерфейса Аксес конечно легче. НО его же не выгрузишь потом в VB если надо сделать EXE c нормальным дистрибутивом. с п.4 согласен на 100% т.к. это привносит изрядное количество лишних операций над данными. парсер.net 1 Visual Studio Express SqlServer Express вроде бы бесплатные и любой может скачать их с микрософта 2 Имеем новую платформу с очень большими возможностями 3 Изучать ее более перспективно чем VB 4 Вообщем при возможности этим стоит заняться 5 наверное для нашей задачи .net не помощник Хмм а тут я тормознул. Нет про SqlServer Express я знаю, а вот подумать что можно поискать у мелкософта Visual Studio Express SqlServer Express чтото не догадался парсерпо поводу парсера на текущий момент я сделал следующие открытия 1 я предложил strBuffer as String заменить на bytBuffer() as Byte для экономии памяти но оказалось 2 память конечно сэкономилась и можно в два раза больший буфер выделить 3 InStrB медленней в три раза чем InStr 4 InStrRevB отсутствует пункт 3 не заметил т.к в обоих случаях идет выполнение в течении 1 сек. Оставил все на Instr чтобы не связываться дополнительными преобразованиями. пункт 4 еще в пятницу в хелпе прочитал :) и еще наткнулся на то,что при таком анализе перед записью в файл результата требуется обратное преобразование информации. парсерпарсинг заружая файл по частям 1 я пока еще не все посмотрел 2 бейсик цикл For lngIndex = 1 to 1 000 000 000 делает медленно а это как раз гигабайт 3 читая по кускам мы увеличиваем количество вызовов функции InStr те если у нас есть 10 Мб а в них только две записи удовлетворяющих критерию поиска и размер каждой записи 1МБ если все 10МБ загружены в память то за 2 вызова InStr (только две записи удовлетворяют поиску) мы отсканируем весь файл 10Мб а теперь посмотрим что будет если будем читать файл кусками по 1Мб прочитали 1 Мб вызвали InStr и так десять раз результат поиска тот же но InStr вызывалась в пять раз больше раз 4 у меня подозрение что увеличение количества вызовов функции InStr может существенно замедлить программу как раз это я и собираюсь проверить 5 именно поэтому когда мы ищем строку мы ищем самую фильтрующую подстроку в первую очередь те первой надо искать строку иванов иван иванович и лучше поискать потом назад и вперед от найденной позиции но если таки фамилий целый список тогда получается что лучше искать по UserInfo если записей с UserInfo существенно меньше чем всех записей а если UserInfo почти в каждой записи тогда надо просто искать IncomingTime OutgoingTime Я тоже этот вариант посмотрел. Тут у меня несколько вопросов появилось. 1)Если файл меньшего объема чем зарезервированная область в буфере. не будет ли тут программа спотыкаться? Или например надо просмотренную информацию в буфере сбросить перед чтением следующего фрагмента файла? 2)Как идет адресаций при просмотре файла фрагментами (я имею ввиду переменную LngBufferPosition)? она сквозная для всего файла или в каждом фрагменте , помещенном в StrBuffer, идет с 1 позиции? 3) Пока не понял почему, но при малом значении размера буфера программа теряет связь с файлом результата. т.е. Первые несколько проходов по StrBuffer и запись результатов нормально, а затем File Not Found. При увеличении размера буфера это пропадает, но я так полагаю исключительно из-за того что уменьшается количество проходов. по пункту 5. Отчет делается по конкретному Иванову Ивану Ивановичу. Не по списку. Т.к. надо по каждому Иванову или Сидорову сделать свой файл с результатами. парсерформат файла лога 1 признаюсь до сих пор не я уверен что правильно понимаю формат файла лога 2 мне это не важно а вот Owl для написания правильного запроса необходимо 3 когда я создал свой тестовый файл и прогнал gawk который дал Owl у меня все нашлось и быстро 4 я gawk синтаксис не смотрел пока не было времени потому в gawl я не советчик 5 предлагаю написать здесь четкий алгоритм того что надо найти и куда этого в итоге будет выгружено 6 чтобы любой мог прочитав этот алгоритм мог сразу написать прогу парсера и она оказалось верной 7 понятно какие-то специфические действия не нужны пример алгоритма 1 из файла source.txt размером 1200 МБ извлекаются записи и помещаются в файл destination.txt 2 размер каждой записи не превышает 10Мб (а может он вообще не ограничен) 3 запись удовлетворяющая критерию поиска находится так 4 обозначения <символ новой строки> <cr> <любое количество любых символов> <*> 5 начало записи это строка <cr><*>IncomingTime<*><cr> 6 конец записи это строка <cr><*>OngoingTime<*><cr><*><cr> (после строки OngoingTime идет еще одна строка) 7 запись содержит <cr><*>UserInfo<*><cr><*>Иванов<*>Иван<*>Иванович<*><cr> вот так я понимаю алгоримт поиска который нужен по пункту 2 размер записи плавает. И зависит от степени Журнализации лога выставленной на сервере. Скажем так при нынешней степени размер дневного лога составляет всего 150-300 Мб, а при полной журнализации 1,2Гб-2Гб. При сохранении тойже структуры. В остальном возражений по алгоритму нет. Собственно все это я с Вашей помощью уже сделал, Осталось только с большими файлами разобраться до конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 11:52 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
где-то по текстуПрошу прощения а Вы код не вредакторе пишите? Это какой-то отдельный редактор ? Просто на studio 10 в том редакторе очень комфортно программировать из-за многочисленных подсказок и меток от-до. Думаю, может есть отдельный редактор и компилятор? Заранее спасибо работал с немаленькой базой, своей тип Random. Примерно 8 таблиц таких связывал. Работает быстро, НО было время испробовать adodb и dao, та работает чучуть медленней, но зато в коде можно накосить из-за многострочной программы. И не помню какая из adodb или dao для меня не понравилась, поскольку простая функция там работала для меня непонятно. Перешел на базу данных. Что касается кнопки "Стоп", то нажимая на "Стоп" изменяем флаг переменной, а в цикле проверяем эту переменную. С DoEventами также можно запутаться. Против повторного запуска ненужного процесса используются флаги. На работе Dim переменная(максимальное количество строк) as string * на количество - одно, вдома - это число больше в несколько раз. В диспетчере видно как растет оперативка. Также может непредвиденно ругнуться. С типом вариант - вопше медляк/тужняк. Разборка строк осуществлялась замером Len(), отрезанием Mid, left, right (не пробовал разницы в скорости между mid и mid$, аналогично left$...), instr() и instrrev() Работая с разборкой строки большего объема на <html> теги, xml и еще одной системы (которая теги описывает квадратными скобками) сообщаю, что по сравнению с встроенными функциями других разработчиков (ну хотя-бы adobe плеер) аналогичных действий - эти процессы выполняются в десяток раз быстрей чем на VB ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 15:51 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Андрей159 где-то по текстуПрошу прощения а Вы код не вредакторе пишите? Это какой-то отдельный редактор ? Просто на studio 10 в том редакторе очень комфортно программировать из-за многочисленных подсказок и меток от-до. Думаю, может есть отдельный редактор и компилятор? Заранее спасибо работал с немаленькой базой, своей тип Random. Примерно 8 таблиц таких связывал. Работает быстро, НО было время испробовать adodb и dao, та работает чучуть медленней, но зато в коде можно накосить из-за многострочной программы. И не помню какая из adodb или dao для меня не понравилась, поскольку простая функция там работала для меня непонятно. Перешел на базу данных. Что касается кнопки "Стоп", то нажимая на "Стоп" изменяем флаг переменной, а в цикле проверяем эту переменную. С DoEventами также можно запутаться. Против повторного запуска ненужного процесса используются флаги. На работе Dim переменная(максимальное количество строк) as string * на количество - одно, вдома - это число больше в несколько раз. В диспетчере видно как растет оперативка. Также может непредвиденно ругнуться. С типом вариант - вопше медляк/тужняк. Разборка строк осуществлялась замером Len(), отрезанием Mid, left, right (не пробовал разницы в скорости между mid и mid$, аналогично left$...), instr() и instrrev() Работая с разборкой строки большего объема на <html> теги, xml и еще одной системы (которая теги описывает квадратными скобками) сообщаю, что по сравнению с встроенными функциями других разработчиков (ну хотя-бы adobe плеер) аналогичных действий - эти процессы выполняются в десяток раз быстрей чем на VB Я конечно извиняюсь, но что то тут сумбур какойто. Вопервых в изложенной задаче любая БД это значительное уменьшение быстродействия. Во первых из-за того что как правило разом обрабатывается от 370 файлов и больше со средним размером 150-200 Мб. Это надо каждый импортировать (раз замедление), обработать (запрос на поиск по параметру + запрос на поиск фрагмента а то и 2 запроса), выгрузить результат, по окончании обработки одного файла убить всю инфу плюс для некоторых БД неплохо бы было сжать базу например при использовании Mdb надо обязательно. Иначе достигаем 4Гб и программа базка падает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 16:21 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
ТС, вам нужен специализированный софт. который делает text search по файлам компа (с интеграцией системного кэша), что-то вроде google search и тп ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 16:26 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
кстати в полных версиях SQL-server есть Full-Text Search ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 16:27 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
а что с редактором 11750479 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 16:29 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
посмотрел производительность убедился в том что мы не можем в бейсике делать интенсивный цикл из InStr интересно было бы посмотреть как тот же код будет работать в С++ поэтому если "Иванов" это строка очень редкая во всем файле то будет все работать со скоростью чтения большого лог файла временем на запись в результирующий файл можно пренебречь тк "Иванов" это строка очень редкая размер самой записи тоже не большой но если Иванов есть в каждой записи то работать не будет тормозит бесконечно сделал алгоритм который по частям читает ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 22:28 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
см parser.zip ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 22:43 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
не получается приложить файл наверное это можно сделать только зарегистрированным пользователям ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 22:47 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсерпосмотрел производительность убедился в том что мы не можем в бейсике делать интенсивный цикл из InStr интересно было бы посмотреть как тот же код будет работать в С++Тот же код в С++ будет работать так-же меделенно. У тебя в программе (которая в 11753402 ) куча фигни и ненужных действий. парсерпоэтому если "Иванов" это строка очень редкая во всем файлеНикаких "если". Редкость Иванова никак не влияет на задачу. Упрощай: Что изначально нужно? Нужно разбить весь лог на куски. Начало одного куска и начало следующего обозначен строкой в которой есть подстрока ">IncomingTime". Если в куске есть подстрока "Иванов", то этот кусок надо запомнить, иначе проигнорировать. Итого один цикл и в нем два instr или три если текст "Иванов" может появится не только в UserInfo: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Все, и не надо заниматься многочисленным сканированием во всех направлениях. Принцип KISS никто не отменял. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 01:06 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авторWhite Owl поэтому если "Иванов" это строка очень редкая во всем файле я не знаю насколько эта строка редкая но то что это предположение существенно ускорит прогу я уже писал выше допустим весь файл размером 1 Гбайт мы загрузили в оперативку и в этом огромном файле только одна строка Иванов тогда всего лишь два вызова InStr достаточно чтобы обнаружить эту одну строку первый чтобы найти а второй чтобы убедиться что больше нет а теперь посчитаем сколько раз мы вызовем InStr если будем читать файл построчно ответ очень много а значит очень затормозим прогу я сгенерил тестовый файл размером 100Мб и в каждой строке была строка UserInfo и искал так InStr(strBuffer, "UserInfo") и больше ничего не делал те цикл из одной команды так вот 10 000 строк находило за разумное время но 100 000 это уже много и мне кажется что виноват бейсик хотя естественно это надо проверить все таки это не машинный код ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 02:15 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
сделал очередное открытие которое все объясняет выделил буфер байтов bytBuffer() as Byte размером 50 000 байт и просканировал его N раз замерил время выделил буфер байтов bytBuffer() as Byte размером 60 000 байт и просканировал его 5* N / 6 раз замерил время общий объем памяти при сканировании остался тот же обнаружил то о чем никогда бы не подумал при буфере 50 000 время меньше секунды при буфере 60 000 время больше 5 секунд это значит что надо пользоваться буфером 50 000 не больше вот только если наша запись больше 25 000 то получается что мы не можем пользоваться этим алгоритмом алгоритм который я пользовал требует чтобы буфер был по крайней мере в два раза больше размера записи интересно почему такая разница во времени наверное тоже бейсик виноват ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 13:16 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсерсделал очередное открытие которое все объясняет выделил буфер байтов bytBuffer() as Byte размером 50 000 байт и просканировал его N раз замерил время выделил буфер байтов bytBuffer() as Byte размером 60 000 байт и просканировал его 5* N / 6 раз замерил время общий объем памяти при сканировании остался тот же обнаружил то о чем никогда бы не подумал при буфере 50 000 время меньше секунды при буфере 60 000 время больше 5 секунд это значит что надо пользоваться буфером 50 000 не больше вот только если наша запись больше 25 000 то получается что мы не можем пользоваться этим алгоритмом алгоритм который я пользовал требует чтобы буфер был по крайней мере в два раза больше размера записи интересно почему такая разница во времени наверное тоже бейсик виноват странно пользовался буфером 72231300 и 108346950 и там и там секунда ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 13:30 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
я брал N такое чтобы N * 50 000 = 1 000 000 000 как продвигается парсинг файлов не пробовали той функцией что я предложил прогонять огромный файл? кстати перефомулировка одного из вопросов которые я уже спрашивал у нас есть большой файл лога 1Гбайт мы его обрабатываем и получаем результирующий новый файл размером каким? предположим этот файл в 100 раз меньше исходного тогда при таком простом фильтре как у нас мы должны получить скорость обработки приблизительно равную скорости чтения большого 1Гбайт файла лога ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 14:49 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Бюджет на следующий год делаю. Добью вернусь с программой ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 16:39 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
вот новая версия предыдущего парсера работает быстро написал функции аналогичные InStr InStrB ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 15:36 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
посмотрел производительность работы диска на чтение при разных размерах буфера 1 readline FileSystemObject самая медленная 2 FileRead(lngFileHandle, lngBufferAddress, lngBufferLength) при размере &H1000 (4КБайт ) достаточно быстрая 3 FileRead(lngFileHandle, lngBufferAddress, lngBufferLength) при размере &H1000000 (16 Мбайт) быстрее предудыщей 4 FileRead(lngFileHandle, lngBufferAddress, lngBufferLength) при размере 10 * &H1000000 (160 Мбайт) быстрее из п2 в три раза получается что увеличение размера буфера увеличивает скорость чтения грубо говоря надо взять такой буфер который диск физически не успеет заполнить за 1 секунду те если диск читает 100 Мбайт/сек то надо брать буфер больше 100 Мбайт ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 18:26 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
я понимаю задачу так 1 есть несколько файлов логов 2 есть несколько человек о которых надо извлечь информацию из всех логов если это так то можно подправить текущий алгоритм следующим образом 1 передавать список файлов логов в функцию парсера и когда полностью прочитаем файл то не выходить из цикла а просто открыть и прочитать следующий файл понятно что формат логов должен быть один и тот же. это позволит не возиться с написанием батников которые по очереди запускают парсинг передавая каждый раз новое имя файла для парсинга 2 передавать список людей по которым хотим извлечь информацию и когда мы найдем запись с UserInfo просканировать эту запись N раз (количество человек в списке) и соответственно записывать результат в файл для конкретного человека те для каждого человека открываем и держим открым файл результата до конца обработки это нужно сделать тк это очень ускорит прогу получается что за одно сканирование всех исходных файлов мы получим результат сразу для всех людей если же для каждого человека отдельно запускать сканирование файла то для 10 человек получится что мы сканируем один и тот же файл 10 раз а для 100 человек 100 сканирований другими словами в идеале мы должны получить что скорость нашей обработки примерно равна скорости чтения всех файлов и скорости записи всех результирующих файлов тк у нас обрабока простая то ее время примерно нулевое ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 18:41 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсердопустим весь файл размером 1 Гбайт мы загрузили в оперативку и в этом огромном файле только одна строка Иванов тогда всего лишь два вызова InStr достаточно чтобы обнаружить эту одну строку первый чтобы найти а второй чтобы убедиться что больше нет а теперь посчитаем сколько раз мы вызовем InStr если будем читать файл построчно ответ очень много а значит очень затормозим прогуТы считаешь не правильно. Не важно сколько раз вызвать InStr, важно сколько букв будет проверено и предложенный тобой вариант поиска то во одном, то в другом направлении увеличивает нагрузку вдвое. В итоге - да, если "Иванов" встречается в каждом куске - ты будешь бегать по гигабайтному файлу дважды, сначала для поиска Иванова, потом в обратном направлении для поиска IncomingTime, в итоге ты обработаешь два гигабайта. Если Иванов встретится только один раз ты обработаешь гигабайт плюс размер одного куска. И только если Иванов вообще не встретится ты ограничишься одноразовым проходом по файлу. А если искать начало куска (вместо Иванова) и начинать скидывать строки в буфер - то не важно сколько Ивановых в файле. В любом случае проход по файлу будет только один. парсери мне кажется что виноват бейсик хотя естественно это надо проверить все таки это не машинный кодНакладные расходы на вызов команд в Бейсике традиционно одни из самых высоких среди всех ЯП и накладные расходы на множественные вызовы InStr в принципе тоже будут влиять, но по сравнению со скорость работы самого InStr это исчезающе мало. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 19:17 |
|
|
start [/forum/topic.php?fid=60&msg=37572713&tid=2158182]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
113ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
99ms |
get tp. blocked users: |
9ms |
others: | 1202ms |
total: | 1482ms |
0 / 0 |