Moim zdaniem najlepszym sposobem na to jest:
headers = CSV.foreach('file.csv').first
Należy pamiętać, że jej bardzo kuszące, aby korzystać CSV.read('file.csv'. headers: true).headers
ale haczyk jest CSV.read
ładuje cały plik w pamięci i stąd inc zmniejsza ślad pamięci, a także sprawia, że jest on bardzo wolny w przypadku większych plików. O ile to możliwe, należy użyć CSV.foreach
. Poniżej znajdują się odniesienia tylko dla pliku 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
Plik 20MB pamięci ślad wzrost o 314 MB z CSV.read
wyobrazić, co plik 1GB. W skrócie proszę nie używać CSV.read
, zrobiłem i system zszedł na plik 300 MB.
Aby uzyskać więcej informacji: Jeśli chcesz przeczytać więcej na ten temat, here to bardzo dobry artykuł na temat obsługi dużych plików.
także poniżej skrypt użyłem benchmarkingu CSV.foreach
i 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
Dobrze wiedzieć, ale ja zdecydować się na bardziej wyraźnej '.headers' podejście @ Dylan-Markow sugeruje. –