Произвольный доступ к большому двоичному файлу с помощью mmap - замедляется при извлечении информации из конца файлов - PullRequest
0 голосов
/ 13 июня 2019

У меня есть некоторый набор данных, в котором у меня есть куча больших файлов (~ 100), и я хочу очень эффективно извлекать определенные строки из этих файлов (как в памяти, так и по скорости).

Мой код получает список соответствующих файлов, код открывает каждый файл с [line 1], затем отображает файл в память с [line 2], также для каждого файла я получаю список индексов и просматриваю индексы, которые я получить соответствующую информацию (10 байт для этого примера) примерно так: [line 3-4], наконец, я закрываю дескрипторы с помощью [line 5-6].

binaryFile = open(path, "r+b")
binaryFile_mm = mmap.mmap(binaryFile.fileno(), 0)
for INDEX in INDEXES:
    information = binaryFile_mm[(INDEX):(INDEX)+10].decode("utf-8")
binaryFile_mm.close()
binaryFile.close()

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

Теперь к проблеме - код работает хорошо, когда я ограничиваю индексы маленькими (имеется в виду - когда я прошу код получить информацию из начала файла). Но! когда я увеличиваю диапазон индексов, все замедляется до (почти) остановки, и буферная / кэш-память заполняется (я не уверен, связана ли проблема памяти с замедлением).

Итак, мой вопрос: почему имеет значение, извлекаю ли я информацию из начала или конца файла и как мне ее преодолеть, чтобы получить мгновенный доступ к информации из конца файла, не замедляя и не увеличивая бафф? / Использование кэш-памяти.

PS - некоторые числа и размеры: поэтому я получил ~ 100 файлов размером около 1 ГБ, когда я ограничиваю индексы в 0% -10% от файла, он работает нормально, но когда я разрешаю индексу в любом месте файла он перестает работать.

...