ruby:将模式与延迟加载的文件进行匹配

ruby:将模式与延迟加载的文件进行匹配,ruby,regex,file-io,pattern-matching,Ruby,Regex,File Io,Pattern Matching,有没有办法将Ruby模式与文件内容相匹配,只加载与模式匹配所需的文件 例如,给定模式 p = /(abc)*/ 以及包含内容的文件f abcabcdefdef 有没有一种方法可以在不从磁盘读取文件(“def”)的最后三个字母的情况下,将p与f的内容进行匹配?基本上,我希望只根据需要加载一个大文件,同时仍然能够根据文件的任意长部分匹配模式。使用枚举器延迟加载文件块: CHUNK_SIZE = 1024 # adjust to best fit the size of your matching

有没有办法将Ruby模式与文件内容相匹配,只加载与模式匹配所需的文件

例如,给定模式

p = /(abc)*/
以及包含内容的文件f

abcabcdefdef

有没有一种方法可以在不从磁盘读取文件(“def”)的最后三个字母的情况下,将p与f的内容进行匹配?基本上,我希望只根据需要加载一个大文件,同时仍然能够根据文件的任意长部分匹配模式。

使用枚举器延迟加载文件块:

CHUNK_SIZE = 1024 # adjust to best fit the size of your matching regex
def file_overlapping_chunks filename
  Enumerator.new do |yielder|
    pos = 0
    while pos < File.size(filename)
      data = File.open(filename,'r') { |f| f.seek(pos); f.read(CHUNK_SIZE) }
      yielder.yield(data)
      pos += (CHUNK_SIZE / 2) # adjust to best fit size of your matching regex
    end
  end
end

chunker = file_overlapping_chunks('my_big_file')
chunker.find { |chunk| chunk =~ /xyz/ }
CHUNK_SIZE=1024#调整以最适合匹配正则表达式的大小
def文件\u重叠\u块文件名
Enumerator.new do | yielder|
pos=0
而pos

枚举器允许延迟加载文件的各个部分。文件块是重叠的,这样匹配的数据就不会落在块边界上而丢失。在我(草率地)实现它时,文件没有保持打开状态,因此使用它不需要open()或close()。这也不是实现这一点的最快方法,但它很容易使用-只需使用文件名调用并使用提供的枚举器。

如果最后三个字母是
abc
?它如何知道它是否没有加载整个文件?即使最后三个字母是
abc
,只要第一个
d
被命中,文件的其余部分就不再与模式匹配,因为
d
不在模式中。任何形式的打开文件都不会将整个文件保存在内存中吗?File.new(或File.open)似乎总是打开整个文件…@jvm\u更新我的错误,我假设他在查找文件中的每个匹配项。是的,打开文件总是基于每个文件。但是打开一个文件并将其从磁盘读入内存不是一回事。我拥有的文件可能有很多GB长,我希望能够在不将整个文件加载到内存的情况下,将模式与其中相对较小的部分进行匹配。