Meiner Meinung nach der beste Weg, dies zu tun ist:
headers = CSV.foreach('file.csv').first
Bitte beachten Sie, dass seine sehr verlockend CSV.read('file.csv'. headers: true).headers
zu verwenden, aber der Haken ist, CSV.read
lädt komplette Datei im Speicher und damit inc verringert den Speicherbedarf und macht die Verwendung für größere Dateien auch sehr langsam. Wann immer möglich, benutzen Sie bitte CSV.foreach
. Im Folgenden sind die Benchmarks für nur 20 MB-Datei:
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
A 20MB Datei Erhöhung Speicherbedarf von 314 MB mit CSV.read
vorstellen, was eine 1 GB-Datei. Kurz gesagt, verwenden Sie bitte nicht CSV.read
, ich tat und System ging für eine 300 MB-Datei.
Für weitere Informationen: Wenn Sie mehr darüber lesen möchten, ist here ein sehr guter Artikel über die Handhabung großer Dateien.
unten Auch ist das Skript i für CSV.foreach
Benchmarking verwendet und 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
Gut zu wissen, aber ich würde für die explizitere '.headers' Ansatz entscheiden, dass @ Dylan-Markow vermuten lässt. –