在ruby中处理大型CSV文件(20G)
我正在解决一些小问题,并且会就如何解决它提出一些建议:给定一个列数和行数未知的csv文件,输出一个包含值的列列表以及每个值重复的次数。 不使用任何库。
如果文件很小这应该不是问题,但是当它是几个Gigs时,我得到NoMemoryError:无法分配内存。 有没有办法创建一个哈希并从磁盘读取而不是将文件加载到内存? 你可以在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 -pe
, ruby -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