|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
1) Mid заменить на Mid$ 2) Do While lngCurrentPosition <= Len(strBuffer) заменить на Do While lngCurrentPosition <= lngBufferLength Хоть Len и быстрая функция, лучше лишний раз не дергать, если можно не дергать. 3) Тынц ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 20:49 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Если для анализа достаточно LIKE, присмотрись к Hytech. скорость лайка на больших строках и больших количествах за гранью разумного :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 22:00 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
проверил то что предложил Antonariy действительно vbTextCompare тормозит можно по указанной ссылке взять функцию которая нормально работает а может в нашем случае можно vbBinaryCompare использовать вряд ли лог файл по-разному пишет ключевые слова to pureproft Если для анализа достаточно LIKE, присмотрись к Hytech. не понятно что значит LIKE, присмотрись к Hytech ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 23:35 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсерпроверил то что предложил Antonariy действительно vbTextCompare тормозит можно по указанной ссылке взять функцию которая нормально работает а может в нашем случае можно vbBinaryCompare использовать вряд ли лог файл по-разному пишет ключевые слова to pureproft Если для анализа достаточно LIKE, присмотрись к Hytech. не понятно что значит LIKE, присмотрись к Hytech google 1-й строчкой дает hytechdb.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 00:35 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Alex_menУХ ты! Провел сравнительный тест на файлике в 55 Мб. Старая моя прога 4 минуты 43 секунды. С Вашей помощью, новая 1 минута 50 сек. Это конечно не 12 секунд, но более чем двукратное сокращение времени, плюс более точная выгрузка информации это уже не плохо. А теперь интереса ради, посмотри все же на AWK. Скачай вот это: http://gnuwin32.sourceforge.net/packages/gawk.htm и запусти вот это: Код: sql 1. 2. 3.
Сохрани этот текст как test.awk, в первой строке замени "some user name" на то что должно находится в твоей переменной strUserInfo, и запусти его из командной строки: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 01:29 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
to pureproft Hytech я так понял что это бд а нужно просто из файла один раз извлень данные по критерию to White Owl это то что нужно не знаю сложно ли освоить синтаксис но прога делает то что нужно и с максимально возможной скоростью ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 02:46 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
тут пока я пытался опредилить время выполнения возник такой вопрос как удалить из файлового кеша файл а то файл раз читается с диска а все следующие разы читается из памяти что не дает возможности замерять реальное время ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 02:48 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Значится попробую по порядку: 1) По заданному критерию найдено 35 фрагментов общим объемом 4246 строк. строки от10 символов до 70 тыс символов. Так что вполне возможно 2) Пробовал отключить все что связано с выгрузкой в файл получил разницу в 1 секунду. Кстати на средней машинке в офисе выполнение идет вообще 5 минут. 3) По алгоритму. Мне надо вытаскивать фрагмент произвольного количества строк от "[дата время]->IncomingTime" до "[дата время]->OutgoingTime". секция "UserInfo" состоит из 2-х строк во второй как раз и прячется искомый параметр собственно юзер "ИВАНОВ ИВАН ИВАНОВИЧ". 4) по gawk систему скачал, пока еще не изучил. Вопрос сразу, мне нужно обрабатывать массив ежедневных логов чаще всего за год полтора это порядка 500-600 файлов. Gawk позволяет поток обработки организовать 5) остальные предложения по коду сейчас буду пробовать. Сейчас в первую очередь вот что сделаю попробую сбросить strFound сразу после вывода информации. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 08:52 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсертут пока я пытался опредилить время выполнения возник такой вопрос как удалить из файлового кеша файл а то файл раз читается с диска а все следующие разы читается из памяти что не дает возможности замерять реальное времяНе трать время на ерунду, тебе не нужно знать реальное время, все компьютеры разные. Тебе нужно знать разницу между несколькими вариантами алгоритма. Я для этого вообще считываю все данные в память, чтобы операции ввода-вывода не вносили искажений, и прогоняю алгоритм в цикле несколько раз. Еще есть профайлер VB Watch 2 , который умеет замерять время каждой операции, суммирует это время, и на красивых понятных гистограммах показывает, какие строчки наиболее тормозят. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 10:01 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсерпроверил то что предложил Antonariy действительно vbTextCompare тормозит можно по указанной ссылке взять функцию которая нормально работает а может в нашем случае можно vbBinaryCompare использовать вряд ли лог файл по-разному пишет ключевые слова Эврика замена vbTextCompare на vbBinaryCompare сократило время до 1 секунды причем на средней офисной машине, где проход занимал 5 минут 42 секунды. Судя по объему файла результата точность не изменилась. Сейчас сверю то что отбирается с исходным файлом и если все хорошо включу потоковую обработку и разомнусь для начала на 1 Гб логов. Ой Ребята СПАСИБО!!! Правда мне еще кое чего надо разобрать до косточки, но тут уж интернет мне поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 10:34 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Antonariy1) Mid заменить на Mid$ Спасибо за ссылочку этим инструментом не пользовался. А еще подскажите чем отличается Mid заменить на Mid$. В хелпе я нашел только MID и MIDB. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 10:37 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
> Автор: Alex_men > А еще подскажите чем отличается Mid заменить на Mid$. Тем, что Mid работает с типом Variant, поэтому более универсальна, но за универсальность нужно платить, в данном случае - быстродействием. А Mid$ работает сразу с типом String и поэтому более скорострельна. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 11:36 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Игорь Горбонос, Спасибо! А где можно почитать про такие нюансы? Я что то в хелпе такого не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 12:29 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
> Автор: Alex_men > А где можно почитать про такие нюансы? Да вот так на форумах и всплывают такие ньюансы :) На том-же bbs.vbstreets.ru раньше(в годах 2001-2005) было много таких топиков, пока я бывал там и активно участвовал. :) Поспрошай там Хакера, может он накидает тебе ссылок на интересные темы :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 12:35 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, Проблемка нарисовалась. При попытке поместить в память файл объемом 160 Мб. Вылетает OUT OF MEMORY. Вот была ссылочка по чтению больших файлов, попробую там чего найти. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 12:51 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
авторразомнусь для начала на 1 Гб логов боюсь что для файлов такого размера ничего не получится уж слишком большой размер если файл в память не поместиться система его будет в файл подкачки грузить те получим только увеличение работы с диском хотя опять же главное эксперимент если есть 3Г свободной то может и все нормально будет иначе придется изменить процедуру чтобы она по частям файл читала рекомендую посмотреть и gawk я попробовал сделать то что написано не разбираясь так она действительно работает очень быстро и главное то что это одно из предназначений этой проги те прога как раз для этого написана и еще один момент можно улучшить прогу если заменить работу со строкой на на работу с массивом байт те Dim strBuffer as String заменить Dim bytBuffer() as Byte strBuffer = String(0, Length) -> ReВim bytBuffer(Length - 1) и функции InStr, InStrRev, Mid заменить на InStrB, InStrRevB, MidB "B" как раз и означает байт других изменений не нужно Отличие в следующем когда мы читаем строку то из файла читается один байт символ потом он преобразовывается в двухбайтный символ Unicode и сохраняется в строке те строка из 1000 символов будет занимать 2000 байт при таких огромных размерах логов мы существенно экономим память правда я не думаю что это ускорит прогу тк разница во времени сканирования 1Г или 2Г практически нулевая ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:04 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
вот определил на своем компе 1 строка выделяется размером 300Мб размером 400Мб уже не хочет 2 массив байтов выделяется размером 600Мб размером 700Мб уже не хочет ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:22 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, с AWK смотрю но по указанному алгоритму у меня ничего не находит, хотя и отрабатывает быстрою результат =0. А как файл кусками читать. или вот еще нашел можно проекцию создавать и работать с ней ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:23 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, что такое ReBim? не требует ли дополнительного определения или подключения в референсах? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:34 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
Alex_menчто такое ReBim?это ReDim, видимо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:45 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
ReDim опечатка а чтобы читать по кускам нужно немного изменить функцию если у нас только часть файла загружена то здесь CriteryPosition = InStr(lngCurrentPosition, strBuffer, strUserInfo, VbCompareMethod.vbTextCompare) 'MsgBox CriteryPosition If CriteryPosition = 0 Then Exit Do End If уже не надо выходить а просто прочитать следующий кусок If CriteryPosition = 0 Then FileRead position, strBuffer End If единственно что нужно учесть это то что какой-то кусок у нас остался не проверенный LnEndSectionPos позиция последней найденной записи а кусок от LnEndSectionPos до BufferSize не исследован поэтому надо этот кусок поместить в начало буфера в диапазон [0, BufferSize - LnEndSectionPos] и читать следующий кусок записывая данные в диапазон [BufferSize - LnEndSectionPos, BufferSize] вот и все остальное без изменений итак FileRead теперь объявлена так FileRead (ByRef strBuffer as string, byval lngBufferSize as long, byval lngBufferPosition as long) буфер надо выделять заранее и потом передавать во все функции ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:49 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
gawk может не работать из-за того что условие вероятно подразумевает что строка одна те символ новой строки является разделителем это и есть недостаток этой проги что сначала надо узнать синтаксис для построения верного запроса сам я не пытался синтаксис читать ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 13:52 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
парсер, По чтению сейчас буду разбираться, а вот при изменении strBuffer на bytBuffer информацию больше не находит. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 14:00 |
|
Работа с большими текстовыми файлами.
|
|||
---|---|---|---|
#18+
забыл написать тк когда мы ищем байты то и искомые строки надо в байты перевести те strLineEnd strUserInfo и тд те все что ищем вот функция private sub StrToByt(byval strSource as string, byref bytDestination() as Byte) dim lngIndex as long ReDim bytDestination(len(strSource)-1) for lngIndex = 1 to len(strSource) bytDestination(lngIndex-1)=asc(mid(strSource, lngIndex, 1)) next end sub а это ее использование dim bytLineEnd() as Byte dim bytUserInfo() as byte StrToByt(vbcrlf, bytLineEnd) StrToByt("UserInfo", bytUserInfo) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 14:16 |
|
|
start [/forum/topic.php?fid=60&msg=37567370&tid=2158182]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 397ms |
total: | 531ms |
0 / 0 |