Если файл не слишком большой, и вы можете сэкономить память, быстрее всего просто наброситься на весь файл и просто использовать string.find
.Если нет, вы можете искать файл по блоку.
Ваш подход не так уж и плох.Я бы предложил загрузку файла в перекрывающихся блоках.Перекрытие позволяет избежать разделения шаблона между блоками и остаться незамеченным, например:
".... ...A BC.. ...."
Моя реализация выглядит следующим образом:
size=4096 -- note, size should be bigger than the length of pat to work.
pat="ABC"
overlap=#pat
fh=io.open(filepath,'rb') -- On windows, do NOT forget the b
block=fh:read(size+overlap)
n=0
while block do
block_offset=block:find(pat)
if block_offset then
print(block_offset)
offset=block_offset+size*n
break
end
fh:seek('cur',-overlap)
cur=fh:seek'cur'
block=fh:read(size+overlap)
n=n+1
end
if offset then
print('found pattern at', offset, 'after reading',n,'blocks')
else
print('did not find pattern')
end
Если ваш файл действительно имеет строки, вы такжеиспользуйте объясненный трюк здесь . В этом разделе в книге Программирование на Lua объясняются некоторые соображения производительности при чтении файлов.