powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему валится FileSystemObject при 5-6 обращении
23 сообщений из 23, страница 1 из 1
Почему валится FileSystemObject при 5-6 обращении
    #35456450
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток, товарищи

Подскажите пожалуйста почему валится след. кусок кода примерно на 5-6 обращении:
Код: plaintext
1.
2.
3.
4.
5.
Dim FileStr() As String 

    Set objTtxStrm = objFso.OpenTextFile(FileName, ForReading, False, TristateUseDefault)
    FileStr = Split(objTtxStrm.ReadAll, vbCrLf, , vbBinaryCompare)
    objTtxStrm.Close

Отмечу сразу что в массив зачитываются просто огроменные файлы логов. Вот и собственно как сделать так чтобы не валилось считывание инфы из логов в массив?

Спасибо.
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35456454
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
    ......
    objTtxStrm.Close
    objTtxStrm = Nothing
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35456473
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ох, так basic даже сплитовать массив отказался
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35456717
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandorогроменные файлы а какие они, огромные, случайно не более двух гиг
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457070
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor
Отмечу сразу что в массив зачитываются просто огроменные файлы логов. Вот и собственно как сделать так чтобы не валилось считывание инфы из логов в массив?

Читать их по частям.
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457206
Ashton_Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в MSDN написано.

"For large files, using the ReadAll method wastes memory resources.
Other techniques should be used to input a file, such as reading a
file line by line."


Можно посоветовать читать файл частями с помощью метода ReadLine.
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457355
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_ Kallandorогроменные файлы а какие они, огромные, случайно не более двух гиг

Я тренировалась на текстовом файле размером в 147 Мб, но в реальности должны подтягиваться файлы с размерами до 1,5 Гб


Собственно в соотв. с БОЛ я и использовала метод ReadAll - и он выполняется довольно-таки долго. А какие еще есть способы считывания больших массивов данных из файлов?
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457375
Toking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте использовать ADODB.Stream ...
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457441
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скажите, вот вы прочитали пару записей (допустим всего две)
что дальше будете делать?
какова, вообще, цель?
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457638
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я к тому что можно так прочитать, и подобрать наибольшую скорость, подбирая размер masFile()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim masFile() As Byte
Open inpFile For Binary Access Read Lock Read As #inpFree
rSize = LOF(inpFree)
	
ReDim masFile(  0  To ? )

Do While rSize > ???
     Get #inpFree, , masFile()
     тут работаете с masFile()
Loop
	
Close #inpFree
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457873
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_скажите, вот вы прочитали пару записей (допустим всего две)
что дальше будете делать?
какова, вообще, цель?

Цель просто поиск в большом текстовом файле определенного контекста и в зависимости от насторек выводить несколько строк до и после этой записи. Вывожу строчки я в TextBox собственно все. Можно еще контекст выделить цветом (но я не знаю как это делается). Самое интересное что должна выводиться вся строка и строчки до и после
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35457879
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_я к тому что можно так прочитать, и подобрать наибольшую скорость, подбирая размер masFile()


А какой размер лучше подбирать для ReadAll/ReadLine / Get ?
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35458408
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для случая Get = 1024 (длина массива)
а ReadAll или ReadLine, для больших файлов не использовал, да и аргументов там по моему нет
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35464665
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стараемся использовать переменные типа integer и byte, т.к. они самые быстрые.
Допустим надо найти "искомое слово" или "какое-нибудь предложение" длиной не более 32768 символов
Чем короче предложение, тем быстрее ищет.
Например фразу "искомое слово", в файле 100 МБ, которая находилась где-то в конце файла,
откомпилированный Project1.exe нашел за три секунды.
Код: plaintext
1.
2.
Private Sub Command1_Click()
    variant2 App.Path & "\file.log", "искомое слово"
End Sub
Код: 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.
Private Sub variant2(FileLog As String, FindWord As String)
Dim LenWord As Integer, KB As Integer, k2 As Integer, bt As Double
Dim masFind() As Byte
Dim masFile() As Byte
Dim rSize As Double, i As Integer, j As Integer, f As Integer, k As Integer, k1 As Byte

Dim time1 As String:                    time1 = Format(Time(), "Long Time")

For i =  1  To Len(FindWord)              'перевод искомого слова в массив кодов
    ReDim Preserve masFind( 0  To i -  1 )
    masFind(i -  1 ) = Asc(Mid(FindWord, i,  1 ))
Next
LenWord = UBound(masFind)

Dim inpFree As Integer
    inpFree = FreeFile

Open FileLog For Binary Access Read Lock Read As #inpFree

k1 =  0                                   'определимся, какими частями будем читать
bt =  0 
KB =  1024 
rSize = LOF(inpFree)
If rSize < KB Then
    KB = rSize
End If

Do While rSize > bt
    bt = bt + KB
    If k1 =  0  Then
        ReDim masFile( 0  To KB)
        k1 =  1                           'читаем первую часть
        k2 = KB
    Else
        ReDim Preserve masFile( 0  To (KB + KB))
        k1 =  0                           'читаем вторую часть сохраняя первую на тот случай,
        k2 = KB + KB                    'если искомое слово оказалось на стыке двух частей
    End If
    Get #inpFree, , masFile()
    
    f = - 1                               'обыкновенный поиск в массиве, "перебором"
    k = - 1 
    For i =  0  To LenWord
        For j = f +  1  To k2
            If masFind(i) = masFile(j) Then
                f = j
                k = k +  1 
                Exit For
            End If
        Next
        If f = - 1  Then Exit For
    Next
    If k = LenWord Then Exit Do
    
Loop
 
Close #inpFree

MsgBox time1 & vbCrLf & Format(Time(), "Long Time")

If k = LenWord Then                     'здесь что-нибудь сообщаем
    stroka = ""
    For i = f - k To f
        stroka = stroka + Chr(masFile(i))
    Next
    MsgBox stroka
Else
    MsgBox "не найдено"
End If

End Sub
хорошо бы, если б вы предложили свой варинт, именно поиска (а то мой делает много лишних сравнений)
или ещё лучше, указать на системную dll, (чтоб не изобретать велосипед)
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35469108
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_

При использовании вашего варианта vasic конечно быстро нашел, но вывел какие-то совершенно не понятные данные.

Мой вариант поиска:

Код: 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.
Sub Select_SbStr_In_File(sel_str As String)
Dim i&, row_mass$

On Error GoTo Select_SbStr_In_FileErr

row_mass$ = ""
SizeAr =  0 
  
    If IsNew_file Then
        Fill_SbStr
        If result <>  0  Then
            Exit Sub
        End If
    End If

SizeAr = UBound(FileStr)

For i& =  0  To SizeAr
    If InStr( 1 , FileStr(i&), UCase(sel_str)) Then
        row_mass$ = row_mass$ + CStr(i&) + ","
    End If
Next i&

If Len(Trim(row_mass)) <>  0  Then
    FileRes = Split(row_mass, ",")
Else
    result =  1 
    ErrorMessage ""
    MsgBox "Заданный контекст в указанном файле не найден"
    Exit Sub
End If

result =  0 
Exit Sub

Select_SbStr_In_FileErr:
    result =  1 
    ErrorMessage "Ошибка при поиске контекста в заданном файле"
    Exit Sub
End Sub

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function IsNew_file() As Boolean

On Error GoTo IsNew_FileErr

IsNew_file = False

If Trim(FileName) <> Old_Filename Then IsNew_file = True

Exit Function

IsNew_FileErr:
    IsNew_file = False
    ErrorMessage "Ошибка при определении имени файла"
    Exit Function
End Function

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub Fill_SbStr()

Dim objFso As New FileSystemObject
Dim objTtxStrm As TextStream

On Error GoTo FillSbStrErr

    Set objTtxStrm = objFso.OpenTextFile(FileName, ForReading, False, TristateUseDefault)
    FileStr = Split(objTtxStrm.ReadAll, vbCrLf, , vbBinaryCompare)
    objTtxStrm.Close
    objTtxStrm = Nothing
    
    result =  0 
    Exit Sub

FillSbStrErr:
    result =  1 
    ErrorMessage "Ошибка при считывании лога в массив в заданном файле"
    Exit Sub
End Sub


Только у меня при чтении больших логов валится с ошибкой: Runtime error! abnormal program termination
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35470117
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот вариант покажет всю строку в которой нашли искомое слово или фразу
Код: 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.
Private Sub variant2(FileLog As String, FindWord As String)
Dim LenWord As Integer, KB As Integer, k2 As Integer, bt As Double
Dim masFind() As Byte
Dim masFile() As Byte
Dim rSize As Double, i As Integer, j As Integer, f As Integer, k As Integer, k1 As Byte

For i =  1  To Len(FindWord)              'перевод искомого слова в массив кодов
    ReDim Preserve masFind( 0  To i -  1 )
    masFind(i -  1 ) = Asc(Mid(FindWord, i,  1 ))
Next
LenWord = UBound(masFind)

Dim inpFree As Integer
    inpFree = FreeFile

Open FileLog For Binary Access Read Lock Read As #inpFree

k1 =  0                                   'определимся, какими частями будем читать
bt =  0 
KB =  1024 
rSize = LOF(inpFree)
If rSize < KB Then
    KB = rSize
End If

Do While rSize > bt
    bt = bt + KB
    If k1 =  0  Then
        ReDim masFile( 0  To KB)
        k1 =  1                           'читаем первую часть
        k2 = KB
    Else
        ReDim Preserve masFile( 0  To (KB + KB))
        k1 =  0                           'читаем вторую часть сохраняя первую на тот случай,
        k2 = KB + KB                    'если искомое слово оказалось на стыке двух частей
    End If
    Get #inpFree, , masFile()
    
    f = - 1                               'обыкновенный поиск в массиве, "перебором"
    k = - 1 
    For i =  0  To LenWord
        For j = f +  1  To k2
            If masFind(i) = masFile(j) Then
                f = j
                k = k +  1 
                Exit For
            End If
        Next
        If f = - 1  Then Exit For
    Next
    If k = LenWord Then Exit Do
    
Loop
 
Close #inpFree

Dim LineBefore As String
Dim Line_After As String
Dim FindBefore As Integer

If k = LenWord Then
    LineBefore = ""                     'найдём строку от найденного, вверх по тексту
    FindBefore = - 1 
    For i = f - k To LBound(masFile) Step - 1 
        If masFile(i) =  13  Or masFile(i) =  10  Then
            FindBefore = i
            Exit For
        End If
    Next
    If FindBefore > - 1  Then
        For i = FindBefore +  1  To f - k -  1 
            LineBefore = LineBefore & Chr(masFile(i))
        Next
    End If
    Line_After = ""                     'найдём строку от найденного, вниз по тексту
    For i = f - k To UBound(masFile)
        If masFile(i) =  13  Or masFile(i) =  10  Then Exit For
        Line_After = Line_After & Chr(masFile(i))
    Next
    MsgBox LineBefore & Line_After
Else
    MsgBox "не найдено"
End If

End Sub
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720106
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправил ошибку в цикле чтения файла

начальная часть прежняя

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Private Sub variant2(FileLog As String, FindWord As String)
Dim LenWord As Integer, KB As Integer, k2 As Integer, bt As Double
Dim masFind() As Byte, masFile() As Byte
Dim rSize As Double, i As Integer, j As Integer, f As Integer, k As Integer, k1 As Byte

For i =  1  To Len(FindWord)              'перевод искомого слова в массив кодов
    ReDim Preserve masFind( 0  To i -  1 )
    masFind(i -  1 ) = Asc(Mid(FindWord, i,  1 ))
Next
LenWord = UBound(masFind)

Dim inpFree As Integer
    inpFree = FreeFile

Open FileLog For Binary Access Read Lock Read As #inpFree

k1 =  0                                   'определимся, какими частями будем читать
bt =  0 
KB =  1024 
rSize = LOF(inpFree)
If rSize < KB Then
    KB = rSize
End If

этот цикл исправил
Код: 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.
Do While rSize > bt
    bt = bt + KB
    ReDim masFile( 0  To KB)
    Get #inpFree, , masFile()
    
    f = - 1                               'обыкновенный поиск в массиве, "перебором"
    k = - 1 
    For i =  0  To LenWord
        For j = f +  1  To KB
            If masFile(j) <>  13  And masFile(j) <>  10  Then 'пропускаем vbCrLf
                If masFind(i) = masFile(j) Then
                    f = j
                    k = k +  1 
                    Exit For
                End If
            Else
                If k < LenWord Then
                   k = - 1 
                End If
            End If
        Next
        If f = - 1  Then Exit For
    Next
    If k = LenWord Then Exit Do
Loop
Close #inpFree

конечная часть прежняя

Код: 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.
Dim LineBefore As String
Dim Line_After As String
Dim FindBefore As Integer

If k = LenWord Then
    LineBefore = ""                     'найдём строку от найденного, вверх по тексту
    FindBefore = - 1 
    For i = f - k To LBound(masFile) Step - 1 
        If masFile(i) =  13  Or masFile(i) =  10  Then
            FindBefore = i
            Exit For
        End If
    Next
    If FindBefore > - 1  Then
        For i = FindBefore +  1  To f - k -  1 
            LineBefore = LineBefore & Chr(masFile(i))
        Next
    End If
    Line_After = ""                     'найдём строку от найденного, вниз по тексту
    For i = f - k To UBound(masFile)
        If masFile(i) =  13  Or masFile(i) =  10  Then Exit For
        Line_After = Line_After & Chr(masFile(i))
    Next
    MsgBox LineBefore & Line_After
Else
    MsgBox "не найдено"
End If

End Sub
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720124
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какого формата эти большие текстовые логи. может их просто через ADODB.Recordset открывать и обрабатывать?
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720150
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа какого формата эти большие текстовые логибез разницы
просто ищет совпадение указанных символов в любом файле
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720151
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда через ADODB запросом будет проще
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720180
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Public Sub MakeSchema(ByVal FileName As String)
Dim s As String
Dim sFile As String
Dim ss As String
Dim sPath As String

sPath = modFiles.FileGetPath(FileName)
sFile = sPath & "SCHEMA.INI"
ss = Dir(sPath & "*.*")
Do
If ss = "" Then Exit Do
FileName = sPath & ss


s = modFiles.FileGetNameOnly(FileName) & ".txt"

modFiles.ProfileSetString s, "ColNameHeader", "True", sFile
modFiles.ProfileSetString s, "Format", "TabDelimited", sFile
modFiles.ProfileSetString s, "CharacterSet", "ANSI", sFile
modFiles.ProfileSetString s, "MaxScanRows", "0", sFile

ss = Dir()
Loop

End Sub



'*в директории c:\tmp только txt файлы ваших логов

ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;PageTimeout=5;Extensions=txt;" & _
"DBQ=c:\tmp;DefaultDir=c:\tmp;"

MakeSchema FileName

Set cn = New ADODB.Connection
cn.CursorLocation = adUseClient
cn.CommandTimeout = 20
cn.ConnectionTimeout = 30
cn.Open ConnectionString


142 Set rs = New ADODB.Recordset
144 rs.CursorLocation = adUseClient
146 Set rs.ActiveConnection = cn
SQL = "SELECT Field1 FROM [mylog#txt] WHERE Field1 LIKE '%строка%'"
148 rs.Open SQL, , adOpenStatic, adLockReadOnly, adCmdText
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35720184
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл обрамление кода ;(
...
Рейтинг: 0 / 0
Почему валится FileSystemObject при 5-6 обращении
    #35744657
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: plaintext
1.
2.
3.
4.
5.
6.
Schema.ini
[mylog.txt]
ColNameHeader = False
Format = TabDelimited
CharacterSet = ANSI
MaxScanRows =  0 
Col1 = Action Text
Код: 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.
Private Sub Command1_Click()
    Dim ConnectionString As String
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
                       "DriverId=27;FIL=text;MaxBufferSize=2048;" & _
                       "PageTimeout=5;Extensions=txt;log" & _
                       "DBQ=C:\TMP\;DefaultDir=C:\TMP;"
                       
    Set cn = New ADODB.Connection
    cn.Open ConnectionString
    
    Set rs = New ADODB.Recordset
    Set rs.ActiveConnection = cn
    
    Dim SQL As String
    SQL = "SELECT * FROM [mylog.txt] WHERE Action LIKE '*искомое слово*'"
    
    rs.Open SQL, , , , adCmdText
    
    Do While Not rs.EOF
        Debug.Print rs!Action
        rs.MoveNext
    Loop

    rs.Close:   Set rs = Nothing
    cn.Close:   Set cn = Nothing
End Sub
Вообщем все работает, правда, несколько медленнее чем если открыть Open FileLog For Binary
но в моем случае, это не критично. К тому же условия, поиска и выбора записей, могут быть разные.
И то что вы предложили, очень удобно.

Спасибо
С уважением Игорь.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему валится FileSystemObject при 5-6 обращении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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