我想解析MaxMind GeoIP2数据库的两个CSV文件,根据列进行一些连接并将结果合并到一个输出文件中。
我使用标准的CSV ruby库,速度非常慢。我认为它试图将所有文件加载到内存中。
block_file = File.read(block_path)
block_csv = CSV.parse(block_file, :headers => true)
location_file = File.read(location_path)
location_csv = CSV.parse(location_file, :headers => true)
CSV.open(output_path, "wb",
:write_headers=> true,
:headers => ["geoname_id","Y","Z"] ) do |csv|
block_csv.each do |block_row|
puts "#{block_row['geoname_id']}"
location_csv.each do |location_row|
if (block_row['geoname_id'] === location_row['geoname_id'])
puts " match :"
csv << [block_row['geoname_id'],block_row['Y'],block_row['Z']]
break location_row
end
end
end
是否有另一个支持chuncks处理的ruby库?
block_csv
为800MB,location_csv
为100MB。
答案 0 :(得分:6)
只需使用CSV.open(block_path, 'r', :headers => true).each do |line|
代替File.read
和CSV.parse
。它将逐行解析文件。
在当前版本中,您明确告诉它使用File.read
读取所有文件,然后将整个文件解析为CSV.parse
的字符串。所以它完全按照你所说的去做。