FileStream выполняется очень медленно, когда открываются файлы размером более 2 ^ 25 = 32 МБ, почему и как ускорить? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть компонент (который по сути является специализированным двоичным поиском), работающий с файловыми потоками, открытыми следующим образом:

FS = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)

Компонент работает довольно быстро ... до определенного размера файла В этот момент производительность выше , следующая функция быстро ухудшается. Доступ к функции осуществляется несколько раз в зависимости от размера файла, который сам зависит от количества записей, а именно log2 (NumRecords) раз. Т.е. удвоение размера файла приводит к еще одному выполнению функции.

'Record is the 0-based record number. A record has a size of 
'giRecordLengthBytes bytes, and its key contains giKeyLengthBytes bytes.
Private Function pGetKey(Record As Int64) As String
    'Calculate the position in the stream at which the record begins, and
    'set the stream's reading position accordingly.
    Dim lPos As Int64 = Record * giRecordLengthBytes +
        grUnicodeFileProperties.BytesInBOM
    goFS.Position = lPos

    'Read the key starting there.
    Dim abKey(0 To CInt(giKeyLengthBytes) - 1) As Byte
    goFS.Read(abKey, 0, CInt(giKeyLengthBytes))

    'Return the key as a Unicode string. Unicode.GetString is in the 
    'imported System.Text.Encoding namespace.
    Return Unicode.GetString(abKey)
End Function

Тем не менее, разбивку можно отнести к комбинациям Position и Read. Вот время, когда 100 раз, 10 000 раз и 1 миллион раз обращаются к случайным записям в файлах разного размера, выраженных в микросекундах за каждую доступную запись. 32 МБ? Я не вижу ничего особенного между 2 ^ 25 байтами (быстро) и 2 ^ 26 байтов (медленно), это даже не специальный кроссовер, как, скажем, между 2 ^ 32 и 2 ^ 33 байтами.

Как бы Я продолжаю искать причину, и, ну, обрабатывать большие файлы быстрее?

Processor: Intel Core i7-8550U, 8 MB Intel Smart Cache
RAM: 16 GB
OS: Win 10 Pro 64-bit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...