Я думаю, что вам придется написать это самостоятельно, поскольку это кажется довольно специфической вещью: вам придется реализовать все (или нужное подмножество) из IO
методов с использованием фрагмента открытогофайл в качестве источника данных.Примером «специальности» может быть запись в такой поток - вам следует позаботиться о том, чтобы не пересекать границу данного сегмента, то есть постоянно отслеживать текущую позицию в большом файле.Не похоже на тривиальную работу, и я не вижу каких-либо ярлыков, которые могли бы помочь вам в этом.
Возможно, вы найдете какое-то решение на базе ОС, например, создание устройства с обратной связью из частибольшой файл (см., например, man losetup
и, в частности, опции -o
и --sizelimit
).
Вариант 2:
Если вы в порядке с сохранениемсодержимое окна в памяти все время, вы можете обернуть StringIO
вот так (просто эскиз, не проверено):
def sliding_io filename, offset, length
File.open(filename, 'r+') do |f|
# read the window into a buffer
f.seek(offset)
buf = f.read(length)
# wrap a buffer into StringIO and pass it given block
StringIO.open(buf) do |buf_io|
yield(buf_io)
end
# write altered buffer back to the big file
f.seek(offset)
f.write(buf[0,length])
end
end
И использовать его так же, как и блоквариант IO#open
.