powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
25 сообщений из 168, страница 4 из 7
Работа с большими текстовыми файлами.
    #37567549
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menА где можно почитать про такие нюансы? Я что то в хелпе такого не нашел.Только в разных обсуждениях, запасясь поллитрой.
Если без поллитры, то тем же профайлером можно выявлять аномально тормозные процедуры или инструкции и выяснять причины аномалий более предметно. По мере накопления статистики причины начнут классифицироваться и превращаться в правила...
1) Помнить о типах.
2) COM тормозит. Нужно по возможности выносить из циклов объектные вызовы.
3) В каких-то случаях быстрее ByVal, в каких-то — ByRef.
4) Строки тормозят. При малейшей возможности свалить все работы со строками на специализированные функции/компоненты.
5) Матан. Если часто (в цикле, например) вычисляется какая-то формула с несколькими параметрами, в 99 случаях из 100 из нее можно выделить часть-константу, которую можно посчитать до начала цикла.
И куча более узких правил, которые не вспомнишь до тех пор, пока не увидишь их нарушения в коде.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567622
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините за оффтоп.... а так while(<>){if {m//){}} не пробовали еще?
Я когда начал пробовать - мне понравилось. оно гигабайтами жрет, и не поперхнется.
Бейсик - тоже очень хороший язык.... но логи - на перле бы? его же специально именно для этого и придумали )))). поначалу непривычно, а потом - быстро и четко.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567683
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер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)

Прошу прощения за невежество. У Вас определение идет как SUB. Тогда ее вызов я так понимаю должен быть
Код: vbnet
1.
2.
call StrToByt(vbcrlf, bytLineEnd)
call StrToByt("UserInfo", bytUserInfo)  


Но в этом случае возвращаемое в переменные bytLineEnd и bytUserInfo неопределено. те. MSGBOX возвращает ?

Если это функции то их значение должно чему то присваиваться. тогда получается непонятно определение зачем в функцию передавать байтовые переменные bytLineEnd() и bytUserInfo() если им надо присваивать.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567803
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
call имя функции или процедуры писать не стоит тк это всего лишь лишнее слово и скобки
лучше просто имя функции и ее параметры но без скобок
в функцию передается массив байтов byref те передается по ссылке
это значит что при выходе из него изменения внесенные в этот массив останутся
можно посмотреть в отладчике это массив после присвоения там должны быть те же символы что и в исходной строке
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567848
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

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

Предидущее сообщение написал не прочтя ваше последнее сообщение
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567896
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
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.
Private Sub Test06()
    Dim bytLineEnd() As Byte
    Dim bytUserInfo() As Byte
    Dim strBuffer1 As String
    Dim strBuffer2 As String
    Dim lngPosition As Long
    
    
    StrToByt vbCrLf, bytLineEnd
    StrToByt "UserInfo", bytUserInfo
    
    strBuffer1 = "abc " & "UserInfo" & vbCrLf
    StrUToStrB strBuffer1, strBuffer2
    
    lngPosition = InStr(1, strBuffer1, "UserInfo", VbCompareMethod.vbBinaryCompare)
    MsgBox lngPosition

    lngPosition = InStrB(1, strBuffer2, bytUserInfo, VbCompareMethod.vbBinaryCompare)
    MsgBox lngPosition
End Sub

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

Private Sub StrUToStrB(ByVal strSource As String, ByRef strDestination As String)
    Dim lngIndex As Long


    If Len(strSource) / 2 > 0 Then
        strDestination = String(Len(strSource) / 2 + 1, 0)
    Else
        strDestination = String(Len(strSource) / 2 + 1, 0)
    End If
    
    For lngIndex = 1 To Len(strSource)
        MidB(strDestination, lngIndex, 1) = Mid(strSource, lngIndex, 1)
    Next
End Sub
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567909
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
    If Len(strSource) / 2 > 0 Then
        strDestination = String(Len(strSource) / 2 + 1, 0)
    Else
        strDestination = String(Len(strSource) / 2 , 0)
    End If
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37567954
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсерединственно что нужно учесть это то что какой-то кусок у нас остался не проверенный
LnEndSectionPos позиция последней найденной записи
а кусок от LnEndSectionPos до BufferSize не исследован

поэтому надо этот кусок поместить в начало буфера в диапазон
[0, BufferSize - LnEndSectionPos]
и читать следующий кусок записывая данные в диапазон
[BufferSize - LnEndSectionPos, BufferSize]


Правильно я понимаю что получается примерно такая вещь:
Пусть Файл некий набор данных и мы его рубим кусками пусть по 10 МБ
Код: plaintext
1.
|         10Mb        |         10Mb        |         10Mb        |         10Mb        |         10Mb        | 

тогда мы читаем некое количество байт до первого вхождения в диапазон UserInfo. После этого мы по сути осуществляем сдвиг диапазона. Правильно?

Код: plaintext
1.
|ххххххххххх|         10Mb       |         10Mb       |         10Mb       |         10Mb       |остаток| 

А что происходит в случае если искомый фрагмент окажется на границе. (выделю его слешами). Не будет ли в этом случае потери данных?
Код: plaintext
1.
                    UserInfo  
|         10Mb    /  | /        10Mb        |         10Mb        |         10Mb        |         10Mb        | 

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

И еще не понял для чего в FileRead передовать размер буфера если можно изначально определить как
Код: vbnet
1.
dim strBuffer as String * 102400 
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568093
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

Наверное понятнее будет так. В FileRead делаю.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub FileRead(ByVal BufPosition As Long, ByRef strBuffer As String)
    Dim lngFileLength As Long
    Dim lngFileHandle As Long
    Dim  strFilePath As String  

    Dim BufSize As Long
    
    strFilePath="d:\test.txt"
    BufSize = 100
    lngFileHandle = FreeFile()
    Open strFilePath For Binary Access Read Shared As lngFileHandle

    lngFileLength = LOF(lngFileHandle)
    strBuffer = String(BufSize, 0)

            Get lngFileHandle, BufPosition, strBuffer

    
    Close lngFileHandle
End Sub



Далее перехожу в BufferParse. а там будет так.

Код: vbnet
1.
2.
3.
If CriteryPosition = 0 Then
            FileRead lngCurrentPosition, strBuffer
End If



а по окончании выгрузки фрагмента передавать BufPosition=LnEndSectionPos+1

и я так понимаю мне еще надо на EOF проверять.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568105
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Alex_men

Открывай файл _ДО_ цикла обработки и закрывай _ПОСЛЕ_, а ты открываешь/закрываешь при чтении каждой порции

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568124
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно не передавать размер буфера в функцию я просто предложил так чтобы можно было легко менять размер буфера а значит можно будет при желании определить зависимость скорости работы от размера буфера
буфер должен быть не меньше размера максимальной записи иначе придется читать с диска одни и те же данные несколько раз


границы надо корректно обрабатывать
пусть у на такой разрыв
аааааааааUs
erInfobbbbbbbbbbbbbbb
соответственно
мы не найдем посленей строки UserInfo при сканировании буфера
поэтому все данные которые находятся в буфере в диапазоне [последняя найденная позиция, конец буфера]
надо скопировать в диапазон [0, длина остатка=размер буфера - последняя найденная позиция]
и прочитать данные из файла но уже не размером с размер буфера а размером [размер буфера - длина остатка]
и записать их в диапазон [длина остатка, размер буфера]

тк у нас размер буфера достаточный для того чтобы поместилась хотя бы одна запись целиком то при следующем сканировании мы найдем хотя бы одну запись UserInfo
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568148
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menпарсер,

с AWK смотрю но по указанному алгоритму у меня ничего не находит, хотя и отрабатывает быстрою результат =0.

А как файл кусками читать. или вот еще нашел можно проекцию создавать и работать с нейРеальный лог файл покажи.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568493
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсерграницы надо корректно обрабатывать
пусть у на такой разрыв
аааааааааUs
erInfobbbbbbbbbbbbbbb
соответственно
мы не найдем посленей строки UserInfo при сканировании буфера
поэтому все данные которые находятся в буфере в диапазоне [последняя найденная позиция, конец буфера]
надо скопировать в диапазон [0, длина остатка=размер буфера - последняя найденная позиция]
и прочитать данные из файла но уже не размером с размер буфера а размером [размер буфера - длина остатка]
и записать их в диапазон [длина остатка, размер буфера]


Мне кажется я понял о чем вы говорите.
Поправьте меня если я не прав, но мне кажется при моем алгоритме такая ситуация исключена. Сейчас объясню почему.
У меня есть диапазон имеющий четкие границы : Начало диапазона INCOMINGTIME и конец диапазона OUTGOINGTIME. и где то внутри сидит в произвольном месте параметр USERINFO.
USERINFO является критерием поиска. и когда я его нахожу получаю метку на первый символ USERINFO.Тут пока никаких противоречий вроде нет.

Так вот по обнаружении метки я не продолжаю читать дальше по файлу. Я выделяю диапазон в котором находится обнаруженный USERINFO. Диапазон от vbCrLf перед меткой начала диапазона INCOMINGTIME до vbCrLf расположенного за меткой конца диапазона OUTGOINGTIME. И весь этот диапазон сбрасываю в файл результата, а в BUFFERPOSITION передаю позицию vbCrLf расположенного за меткой конца диапазона OUTGOINGTIME. И затем читаю следующий диапазон. Боюсь тут даже возможны вариаты перекрытия диапазонов (хотя вроде и без двойного прохода по одним и тем же местам.

Я так понимаю что при таком подходе пропусков быть не должно.

парсертк у нас размер буфера достаточный для того чтобы поместилась хотя бы одна запись целиком то при следующем сканировании мы найдем хотя бы одну запись UserInfo

т.е. я правильно понимаю что если у меня клитерий поиска имеет размер 160 символов, то размер буфера должен быть не меньше 160 символов?

А вот как быть если у меня в буфер считалось вот такая пограничная ситуация: "ввввввввввааааааааааааааассссссссссссUser" вторая часть попадетв следующий фрагмент файла?
"Info ыыыыыыыыыыыыыыыыывввввввввввввввввв"
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568501
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

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

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

Прошу прощения Лог у меня на работе. могу только повторить то что уже писал тут. могу только повторить с комментариями. Структура приведенная ниже соответствует выполнению одного действия пользователем. И всегда одинаково начинается с >IncomingTime и заканчивается всегда >OutgoingTime. Набор остальных секций внутри фрагмента может отличаться. Соответственно весь файл лога состоит из набора таких фрагментов. Размер файла варьируется от 200 кб до 200-250 МБ (и имеет тенденцию к росту).
Может быть это поможет.Если нет, то до понедельника.
Код: 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.
[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->IncomingTime

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->IncomingData

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->ThreadID

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->RequestExecuteStart
текст произвольного объема

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->RequestInfo
текст произвольного объема

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->CheckUserInfo
текст произвольного объема

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->UserInfo
информация о пользователе системы в виде "Специалист Иванов Иван Иванович"

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->TraceParams
текст произвольного объема

[2011.11.28 00:54:45:730][TraceID: TWDPWCC8R36HNU]->StartExecuteTask
текст произвольного объема 

[2011.11.28 00:54:45:746][TraceID: TWDPWCC8R36HNU]->EndExecuteTask
текст произвольного объема

[2011.11.28 00:54:45:746][TraceID: TWDPWCC8R36HNU]->RequestExecuteEnd
текст произвольного объема


[2011.11.28 00:54:45:746][TraceID: TWDPWCC8R36HNU]->OutgoingData
код даты 1 строка

[2011.11.28 00:54:45:746][TraceID: TWDPWCC8R36HNU]->OutgoingTime
код времени 1 строка
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568570
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
правильно я понял что между
IncomingTime
OutgoingTime
может не быть UserInfo и таких случаев много?

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

Правильно при некоторых системных событиях UserInfo может отсутствовать, а например если пользователь зашел в систему , но еще не авторизовался (как раз вводит логин пароль) то UserInfo может быть пустой секцией что соответствует понятию Guest. А мне нужно отобрать данные по содержимому этой секции т.е по Иванову Ивану Ивановичу при этом начисто игнорируя Сидорова Федора Кузьмича
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568583
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а зачем тогда IncomingTime искать
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568586
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
те нашли UserInfo
нашли начало строки перед ним
нашли конец строки за ним
нашли конец строки еще один
получили нужный блок
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568594
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсерте нашли UserInfo
нашли начало строки перед ним
нашли конец строки за ним
нашли конец строки еще один
получили нужный блок
не совсем. т.к. отчет готовится по конкретному Иванову или по Петрову или по сидорову (т.е. по одному пользователю) то Userinfo я не смотрю в принципе.

Я ищу Иванова.
Как только я нашел Иванова ище начало строки перед ближайшим предидущим IncomingTime (начало нужного фрагмента)
начало строки перед ближайшим последующим IncomingTime (Конец нужного фрагмента).

Получил нужный блок.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568612
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кажется понял
но тогда White Owl никак не поможет он же не знает всех ивановых петровых и тд
опять же возникает вопрос
из одного огромного файла лога берется только иванов?
и что для каждого пользователя свой лог?
если это не так те один лог содержит много пользователей
то логично делать наоборот те найти userinfo посмотреть для кого
если надо делать для него отчет то сделать иначе пропустить
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37568614
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да еще вопрос не по теме
а почему выбран бейсик для задачи а не .net ведь там очень много возможностей и проблем гораздо мешьше
Visual Studio 6 мне кажется сегодня и найти не просто
...
Рейтинг: 0 / 0
25 сообщений из 168, страница 4 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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