У меня есть некоторый набор данных, в котором у меня есть куча больших файлов (~ 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% от файла, он работает нормально, но когда я разрешаю индексу в любом месте файла он перестает работать.