Theo tôi cách tốt nhất để làm điều này là:
headers = CSV.foreach('file.csv').first
Xin lưu ý rằng nó rất hấp dẫn để sử dụng CSV.read('file.csv'. headers: true).headers
nhưng bắt là, CSV.read
tải tệp hoàn chỉnh trong bộ nhớ và do đó inc cho thuê bộ nhớ của bạn và cũng như nó làm cho nó rất chậm để sử dụng cho các tập tin lớn hơn. Bất cứ khi nào có thể, vui lòng sử dụng CSV.foreach
. Dưới đây là điểm chuẩn cho chỉ là một tập tin 20 MB:
Ruby version: ruby 2.4.1p111
File size: 20M
****************
Time and memory usage with CSV.foreach:
Time: 0.0 seconds
Memory: 0.04 MB
****************
Time and memory usage with CSV.read:
Time: 5.88 seconds
Memory: 314.25 MB
Một tập tin 20MB tăng bộ nhớ bằng 314 MB với CSV.read
tưởng tượng những gì một tập tin 1GB. Trong ngắn hạn xin vui lòng không sử dụng CSV.read
, tôi đã làm và hệ thống đã đi xuống cho một tập tin 300MB.
Để đọc thêm: Nếu bạn muốn đọc thêm về điều này, here là một bài viết rất hay về cách xử lý các tệp lớn.
Ngoài ra dưới đây là kịch bản tôi sử dụng cho điểm chuẩn CSV.foreach
và CSV.read
:
require 'benchmark'
require 'csv'
def print_memory_usage
memory_before = `ps -o rss= -p #{Process.pid}`.to_i
yield
memory_after = `ps -o rss= -p #{Process.pid}`.to_i
puts "Memory: #{((memory_after - memory_before)/1024.0).round(2)} MB"
end
def print_time_spent
time = Benchmark.realtime do
yield
end
puts "Time: #{time.round(2)} seconds"
end
file_path = '{path_to_csv_file}'
puts 'Ruby version: ' + `ruby -v`
puts 'File size:' + `du -h #{file_path}`
puts 'Time and memory usage with CSV.foreach: '
print_memory_usage do
print_time_spent do
headers = CSV.foreach(file_path, headers: false).first
end
end
puts 'Time and memory usage with CSV.read:'
print_memory_usage do
print_time_spent do
headers = CSV.read(file_path, headers: true).headers
end
end
Nguồn
2018-02-06 07:36:47
Thông tin cần biết nhưng tôi muốn lựa chọn cho môi trường 'cách tiếp cận .headers' rõ ràng hơn rằng @ Dylan-Markow gợi ý. –