Существует нет специального метода, который вы можете реализовать, который позволит re.match()
принимать ваш пользовательский класс и не требовать, чтобы вы считывали все данные в память.
Это потому, что в настоящее время нет специального метода, который позволил бы вашему пользовательскому классу действовать как объект протокола буфера . Методы re
принимают только строки str
(которые реализуют буферный протокол) и строки unicode
(и подклассы, данные доступны напрямую, а не через __unicode__
). Методы re
не принимают произвольные последовательности, и только буферный протокол позволил бы вам избежать считывания всего этого в память за один раз.
Вместо того, чтобы пытаться реализовать пользовательский объект, однако, если ваши данные полностью хранятся в одном файле на диске (но слишком велики для чтения в память), вы хотите использовать отображение памяти . Отображение памяти использует средства виртуальной памяти вашей ОС для доступа к частям файла как к разделам памяти.
Подсистема виртуальной памяти позволяет вашей ОС управлять большим объемом памяти, чем физически доступно вашему компьютеру в виде оперативной памяти, вместо этого помещая куски памяти («страницы») на жесткий диск. При обращении к памяти ОС продолжает выгружать страницы с диска на физическую память и обратно. Отображение памяти просто расширяет эту функциональность для существующих файлов, позволяя обрабатывать очень большой файл как одну большую строку, где ОС гарантирует, что части, к которым вы пытаетесь получить доступ, доступны в памяти при необходимости.
В Python эта функция доступна через mmap
модуль , а файл с отображением в памяти реализует протокол буфера . Вы можете передать такие объекты непосредственно в re.match()
, и Python и ваша ОС будут работать вместе для поиска данных в файле на предмет соответствия.
Итак, учитывая большой файл filename = '/path/to/largefile'
и регулярное выражение pattern
, это будет искать в файле совпадение в начале для вашего шаблона:
import re
import mmap
import os
fd = os.open(filename, os.O_RDONLY)
mapped = mmap.mmap(fd, 0)
matched = re.match(pattern, mapped)
Если у вас есть несколько файлов , вам нужно найти способ объединить их. Виртуально или физически. Если вы используете Linux, вы можете объединять файлы виртуально, используя сетевое блочное устройство, или вы можете использовать виртуальную файловую систему FUSE. См. Виртуальный файл, содержащий объединение других файлов .