我正在处理巨大的数据文件(每个文件有数百万行).

在开始处理之前,我想计算一下文件中的行数,这样我就可以指出处理过程有多远.

由于文件的大小,将整个文件读入内存是不切实际的,只需计算有多少行.有人对如何做到这一点有好的建议吗?

推荐答案

如果你在Unix环境中,你可以让wc -l来做这项工作.

它不会将整个文件加载到内存中;由于它针对流式文件和计算字/行进行了优化,因此性能足够好,而不是自己在Ruby中流式处理文件.

SSCCE:

filename = 'a_file/somewhere.txt'
line_count = `wc -l "#{filename}"`.strip.split(' ')[0].to_i
p line_count

或者,如果希望在命令行上传递一组文件:

wc_output = `wc -l "#{ARGV.join('" "')}"`
line_count = wc_output.match(/^ *([0-9]+) +total$/).captures[0].to_i
p line_count

Ruby相关问答推荐

如何在 Ruby 中反转数字的字节顺序

如何使用 gsub 删除返回字符串中的/和/i?

令人惊讶的有效 Ruby 语法:% 无处不在

构造Ruby的现代方法是什么?

在 MacOS Sierra 上使用 RMagick 2.16 的 ImageMagick 7 找不到 MagickWand.h

如何在 VIM 中导航 Ruby 方法?

如何使用 yardoc 列出未记录的模块/类/常量/方法?

Rails - RSpec - let和let!之间的区别

如何自定义 Jekyll 的 url?

class_eval、class_exec、module_eval 和 module_exec 有什么区别?

ruby datetime 中有 add_days 吗?

将哈希转换为 struct

从命令行调用 ruby​​ 函数

Sinatra 登录?

将 CSV 文件转换为哈希数组

纯 Ruby 并发哈希

工厂女孩 - 目的是什么?

如何在 Ruby 中对数组进行分块

Rubocop 25 线块大小和 RSpec 测试

传递哈希而不是方法参数