ben*_*ams 5 ruby csv performance file
我不确定这个问题只与ruby有关,也许你会发现它与任何其他语言相关.
我想知道我是否应该使用解析或foreach:
CSV.parse(filepath)将解析整个文件并返回一个数组数组,这些数组将反映csv文件并将存储在内存中.稍后,我将处理此数组行.
CSV.foreach(filepath) 将逐行读取/解析文件并逐行处理.
谈到性能,有什么区别吗?有一个更好的方法吗?
PS:我知道在ruby中我可以使用parse方法提供一个块然后它将分别处理每一行.
这是我的测试:
require 'csv'
require 'benchmark'
small_csv_file = "test_data_small_50k.csv"
large_csv_file = "test_data_large_20m.csv"
Benchmark.bmbm do |x|
x.report("Small: CSV #parse") do
CSV.parse(File.open(small_csv_file), headers: true) do |row|
row
end
end
x.report("Small: CSV #foreach") do
CSV.foreach(small_csv_file, headers: true) do |row|
row
end
end
x.report("Large: CSV #parse") do
CSV.parse(File.open(large_csv_file), headers: true) do |row|
row
end
end
x.report("Large: CSV #foreach") do
CSV.foreach(large_csv_file, headers: true) do |row|
row
end
end
end
Rehearsal -------------------------------------------------------
Small: CSV #parse 0.950000 0.000000 0.950000 ( 0.952493)
Small: CSV #foreach 0.950000 0.000000 0.950000 ( 0.953514)
Large: CSV #parse 659.000000 2.120000 661.120000 (661.280070)
Large: CSV #foreach 648.240000 1.800000 650.040000 (650.062963)
------------------------------------------- total: 1313.060000sec
user system total real
Small: CSV #parse 1.000000 0.000000 1.000000 ( 1.143246)
Small: CSV #foreach 0.990000 0.000000 0.990000 ( 0.984285)
Large: CSV #parse 646.380000 1.890000 648.270000 (648.286247)
Large: CSV #foreach 651.010000 1.840000 652.850000 (652.874320)
Run Code Online (Sandbox Code Playgroud)
基准测试是在具有8GB内存的Macbook Pro上运行的.结果表明,使用CSV#parse或CSV#foreach,性能在统计上是等效的.
删除了标题选项(仅测试小文件):
require 'csv'
require 'benchmark'
small_csv_file = "test_data_small_50k.csv"
Benchmark.bmbm do |x|
x.report("Small: CSV #parse") do
CSV.parse(File.open(small_csv_file)) do |row|
row
end
end
x.report("Small: CSV #foreach") do
CSV.foreach(small_csv_file) do |row|
row
end
end
end
Rehearsal -------------------------------------------------------
Small: CSV #parse 0.590000 0.010000 0.600000 ( 0.597775)
Small: CSV #foreach 0.620000 0.000000 0.620000 ( 0.621950)
---------------------------------------------- total: 1.220000sec
user system total real
Small: CSV #parse 0.590000 0.000000 0.590000 ( 0.597594)
Small: CSV #foreach 0.610000 0.000000 0.610000 ( 0.604537)
Run Code Online (Sandbox Code Playgroud)
笔记:
large_csv_file与small_csv_file的结构不同,因此比较两个文件之间的结果(即行/秒)将是不准确的.
small_csv_file有50,000条记录
large_csv_file有1,000,000条记录
Headers选项设置为true会因为为行中的每个字段构建哈希而显着降低性能(请参阅HeadersConverters部分:http://www.ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV .html)
| 归档时间: |
|
| 查看次数: |
4281 次 |
| 最近记录: |