Przekroczona pamiĘĆ przy imporcie pliku csv na heroku

Klient dostarczył mi bardzo duży plik csv , który ma 10 MB pracowników. do importu używam delayed_job i gemu model_import otrzymuje przekroczoną pamięć na heroku. Teoretycznie pewnym rozwiązaniem jest rodzielenie tego pliku na mniejsze ( jednak wtedy walidacja nie będzie działać, gdyż mam pole , które odwołuje się do poprzednich).

Jak to według was powinno być rozwiązane??

Przydałoby się abyś podał kod procedury za pomocą którą importujesz ten plik CSV abyśmy mogli zobaczyć jak go zoptymalizować aby używał mniej pamięci.

10 MB pracowników - tzn. 10 milionów rekordów, czy plik ma 10 MB? W drugim przypadku musiałbyś mieć bardzo małe ograniczenia na pamięć, żeby to się nie zmieniło, więc podejrzewałbym błąd procedury ładującej. W przypadku 10 milionów rekordów najprościej będzie załadować do bazy danych a potem zrobić walidację. Albo - alternatywnie, ściągnąć ten plik na swój komputer i przemielić to u siebie, a wyniki wysłać na serwer (o ile to jest jednorazowa akcja).

# delete existing emoloyees which are not in csv file
# those who are in system AND csv will stay untouched
person_id_column_index = columns.index('person_id')
person_ids_from_csv = values.map { |v| v[person_id_column_index] }
employees_to_delete = related_object.employees.select { |existing_employee| not person_ids_from_csv.include? existing_employee.person_id }
employees_both_in_system_and_csv = related_object.employees.select { |existing_employee| person_ids_from_csv.include? existing_employee.person_id }
person_ids_both_in_system_and_csv = employees_both_in_system_and_csv.map { |e| e.person_id }

employees_to_delete.each { |employee| employee.destroy }
new_values = values.select { |employee_from_csv| not person_ids_both_in_system_and_csv.include? employee_from_csv[person_id_column_index] }

values_to_update = values.select { |employee_from_csv| person_ids_both_in_system_and_csv.include? employee_from_csv[person_id_column_index] }
values_to_update_by_person_id = {}
values_to_update.each { |employee_from_csv| values_to_update_by_person_id[employee_from_csv[person_id_column_index]] = employee_from_csv }

employees_both_in_system_and_csv.each do |employee|
  changed = false
  columns.each_with_index do |column, i|
    employee.send("#{column}=", values_to_update_by_person_id[employee.person_id][i])
    changed ||= employee.send("#{column}_changed?")
  end
  employee.save if changed
end

No i problem wydaje się taki ,że employees_to_updatate i employees_both_in_system_and_csv zajmują sporo niepotrzebnej pamięci.

Moglbyms otoczyc kod znacznikami code=ruby /code? (dodaj nawiasy kwadratowe)

i chyba dać jakiś wiekszy fragment kodu, albo chociaż powiedzieć co to jest values, columns, related_object.