On Tue, Aug 21, 2007 at 07:24:03AM +0900, blufur wrote:
> is there built-in method to determine the number of lines in a file?
> 
> i tried file.readlines.length but it is very slow (dealing with files  
> > 1 million lines)

Here are a few alternatives that use less memory than File.readlines (which
slurps in the entire file into memory):

require 'benchmark'

big_file = '/usr/share/dict/words'

Benchmark.bm do |x|
  x.report('streaming') do
    lines = 0
    File.open(big_file).each_line do |line|
      lines += 1
    end
  end

  x.report('shelling out') do
    lines = Integer(%x(wc -l '#{big_file}')[/^\d+/])
  end
end

On my machine:
      user     system      total        real
streaming  0.270000   0.010000   0.280000 (  0.293957)
shelling out  0.000000   0.000000   0.020000 (  0.052078)

(The file is 234936 lines.)

marcel
-- 
Marcel Molina Jr. <marcel / vernix.org>