代码之家  ›  专栏  ›  技术社区  ›  Nick

如何在Ruby中处理大型文件?

  •  6
  • Nick  · 技术社区  · 17 年前

    编辑: 这是我的密码:

    export = File.new("resultsfinal.txt","w+")
    
    File.open("bibrec2.dat").each do |line|
      line.scan(/[a]{1}[1234567890xX]{10}\W/) do |x|
        export.puts x
      end
      line.scan(/[a]{1}[1234567890xX]{13}/) do |x|
        export.puts x
      end
    end
    
    6 回复  |  直到 17 年前
        1
  •  4
  •   Yoann Le Touche    17 年前

    我已经用同样的语法编写了一个脚本,可以毫无问题地搜索8GB的大文件。

    export = File.new("resultsfinal.txt","w+")
    
    File.open("bibrec2.dat").each do |line|
      begin
        line.scan(/[a]{1}[1234567890xX]{10}\W/) do |x|
          export.puts x
        end
        line.scan(/[a]{1}[1234567890xX]{13}/) do |x|
          export.puts x
        end
      rescue
        puts "Problem while adding the result"
      end
    end
    
        2
  •  3
  •   pguardiario    14 年前

    File.open("resultsfinal.txt","w+") do |output|
        File.open("bibrec2.dat").each do |line|
            output.puts line.scan(/a[\dxX]{10}(?:[\dxX]{3}|\W)/)
        end
    end
    
        3
  •  2
  •   Stevenr12    14 年前
    file = File.new("bibrec2.dat", "r")
    while (line = file.gets)
      line.scan(/[a]{1}[1234567890xX]{10}\W/) do |x|
        export.puts x
      end
      line.scan(/[a]{1}[1234567890xX]{13}/) do |x|
        export.puts x
      end
    end
    file.close
    
        4
  •  1
  •   Mike Woodhouse    17 年前

    /[a]{1}[1234567890xX]{10}\W/
    

    我认为:

    • 一个“a”。你真的想和“a”匹配吗在这种情况下,一个“就足够了,而不是“[a]{1}”。
    • 正好10(数字或“x”或“x”)

    有几个示例ISBN匹配器 here 和 here ,尽管它们看起来更像我们在书的封底看到的格式,我猜你的输入文件已经去掉了一些格式。

        5
  •  1
  •   Igbanam    14 年前

    File#truncate 和 IO#seek 并采用二进制搜索型算法。 #truncate 可能是破坏性的所以你应该 文件(我知道这很麻烦)。

    middle = File.new("my_huge_file.dat").size / 2
    tmpfile = File.new("my_huge_file.dat", "r+").truncate(middle)
    # run search algoritm on 'tmpfile'
    File.open("my_huge_file.dat") do |huge_file|
      huge_file.seek(middle + 1)
      # run search algorithm from here
    end
    

    代码是高度未经测试,脆弱和不完整的。但我希望它能给你提供一个平台。

        6
  •  -2
  •   drudru    17 年前

    当你在一个典型的32位操作系统上使用2G的工作集时,事情通常会变得不确定。