CSV.foreach Использование памяти продолжает расти - PullRequest
2 голосов
/ 24 марта 2019

У меня медленная скорость импорта, обработка CSV-файла со строкой 13 КБ занимает 2,5 часа.

Мне интересно, почему мое использование памяти продолжает расти, когда я увеличиваю размер файла?Я использую foreach, поэтому я подумал, что использование памяти должно быть максимально увеличено при размере каждого пакетного импорта (500 строк за раз).Я пытаюсь обработать большой CSV-файл размером 20 Кбайт быстро и с минимальным использованием памяти.

Есть ли лучший способ сделать это?

Рубин: 2.6.1

Рельсы 5.2.2

Gem Activerecord-import

Код

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)}"
end

nol = 0
ac = Profile.count
lc = Course.count
fc = Book.count

print_memory_usage do
  print_time_spent do
    i = 0
    profiles = []

    CSV.foreach( File.join(Rails.root, 'lib','sample_data', 'sample.csv'), headers: true) do |row|
      nol+=1
      i+=1

      a = Profile.new(user_id: 1)
      l = a.build_course
      f = a.build_book

      l.name = 'TEST-small sample.csv'
      l.course_name  = row[0]
      a.grade = row[1]
      f.book_title = row[3]

      profiles << a

      if i == 500
        puts "Import Stats"
        print_memory_usage do
          print_time_spent do
            Profile.import profiles, recursive: true
          end
        end

        i=0
        profiles=[]
        puts "--Record Count--"
        puts "Profile: #{ac}/#{Profile.count}"
        puts "Course: #{lc}/#{Course.count}"
        puts "Book: #{fc}/#{Book.count}"
      end
    end
    Profile.import profile, recursive: true
    puts "-- TOTAL Memory and Speed --"
  end
end

puts "--Imported #{nol} Records--"

ВЫХОД

Import Stats
Time: 79.3
Memory: 42.51 MB
--Record Count--
Profile: 1823/2323
Course: 1723/2223
Book: 1723/2223
Import Stats
Time: 79.65
Memory: 27.88 MB
--Record Count--
Profile: 1823/2823
Course: 1723/2723
Book: 1723/2723
Import Stats
Time: 80.16
Memory: 9.91 MB
--Record Count--
Profile: 1823/3323
Course: 1723/3223
Book: 1723/3223
Import Stats
Time: 74.83
Memory: 4.19 MB
--Record Count--
Profile: 1823/3823
Course: 1723/3723
Book: 1723/3723

-- TOTAL Memory and Speed --
Time: 350.56
Memory: 102.43 MB
--Imported 2241 Records--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...