Найти индекс строки в производительности большого файла

У меня есть "контейнер", содержащий данные. Размер +- 100 МБ. В контейнере есть несколько "dataids", которые отмечают начало чего-либо.

Теперь мне нужно получить индекс для данного dataid. (например, dataid: '4CFE7197-0029-006B-1AD4-000000000012')

Я пробовал несколько подходов. Но на данный момент "ReadAllBytes" является наиболее производительным.

ReadAll -> в среднем 0,6 секунд

Using oReader As New BinaryReader(File.Open(sContainerPath, FileMode.Open, FileAccess.Read))
    Dim iLength As Integer = CInt(oReader.BaseStream.Length)
    Dim oValue As Byte() = Nothing
    oValue = oReader.ReadBytes(iLength)
    Dim enc As New System.Text.ASCIIEncoding
    Dim sFileContent As String = enc.GetString(oValue)

    Dim r As Regex = New Regex(sDataId)
    Dim lPosArcID As Integer = r.Match(sFileContent).Index
    If lPosArcID > 0 Then
        Return lPosArcID
    End If
End Using

ReadByteByByte -> в среднем 1,4 секунды

Using oReader As BinaryReader = New BinaryReader(File.Open(sContainerPath, FileMode.Open, FileAccess.Read))
    Dim valueSearch As StringSearch = New StringSearch(sDataId)

    Dim readByte As Byte
    While (InlineAssignHelper(readByte, oReader.ReadByte()) >= 0)
        index += 1
        If valueSearch.Found(readByte) Then
            Return index - iDataIdLength
        End If
    End While
End Using



Public Class StringSearch
    Private ReadOnly oValue() As Byte
    Private iValueIndex As Integer = -1

    Public Sub New(value As String)
        Dim oEncoding As New System.Text.ASCIIEncoding
        Me.oValue = oEncoding.GetBytes(value)
    End Sub

    Public Function Found(oNextByte As Byte) As Boolean

        If oValue(iValueIndex + 1) = oNextByte Then
            iValueIndex += 1

            If iValueIndex + 1 = oValue.Count Then Return True
        Else
            iValueIndex = -1
        End If

        Return False
    End Function
End Class

Public Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    target = value
    Return value
End Function

Мне трудно поверить, что нет более быстрого пути. 0,6 секунды для файла размером 100 МБ - неприемлемое время.

Другой подход, который я попробовал, состоит в том, чтобы разбить на куски по X байтов (100, 1000,..). Но был намного медленнее.

Любая помощь в подходе я могу попробовать?

0 ответов

Другие вопросы по тегам