在ruby中处理大型CSV文件(20G)

我正在解决一些小问题,并且会就如何解决它提出一些建议:给定一个列数和行数未知的csv文件,输出一个包含值的列列表以及每个值重复的次数。 不使用任何库。

如果文件很小这应该不是问题,但是当它是几个Gigs时,我得到NoM​​emoryError:无法分配内存。 有没有办法创建一个哈希并从磁盘读取而不是将文件加载到内存? 你可以在perl中使用绑定哈希来做到这一点

编辑:IO#foreach会将文件加载到内存中吗? File.open(filename).each怎么样?

一次读取一行文件,随时丢弃每一行:

open("big.csv") do |csv| csv.each_line do |line| values = line.split(",") # process the values end end 

使用此方法,您永远不会耗尽内存。

你一次读完整个文件吗? 在每行的基础上读取它,即使用ruby -peruby -ne$stdin.each应该减少处理的垃圾收集行的内存使用量。

 data = {} $stdin.each do |line| # Process line, store results in the data hash. end 

将其保存为script.rb并将巨大的CSV文件传输到此脚本的标准输入中:

 ruby script.rb < data.csv 

如果您不想从标准输入中读取,我们需要进行一些小改动。

 data = {} File.open("data.csv").each do |line| # Process line, store results in the data hash. end