5MM 라인 파일을 읽으려고하고 있는데, 지금은 heroku에서 내 메모리 사용량을 초과하고 있습니다. 내 방법은 다소 빠르다 ~ 200 초/초 .. 나는 그것이 수입에 충돌하고 있다고 생각한다. 그래서 나의 계획은 1,000 또는 10,000의 배치로 수입했다. 나는 내 파일의 끝 부분에있어 말할 어떻게 내 질문은, 루비는 .eof
방법하지만 그것 File
방법이 있고, 나는CSV 구문 분석이 너무 많은 메모리를 가져옴
def self.import_parts_db(file)
time = Benchmark.measure do
Part.transaction do
parts_db = []
CSV.parse(File.read(file), headers: true) do |row|
row_hash = row.to_hash
part = Part.new(
part_num: row_hash["part_num"],
description: row_hash["description"],
manufacturer: row_hash["manufacturer"],
model: row_hash["model"],
cage_code: row_hash["cage_code"],
nsn: row_hash["nsn"]
)
parts_db << part
end
Part.import parts_db
end
end
puts time
end
위의 경우에는 .foreach가 권장됩니다.이 인스턴스에서는 작동하지 않습니까? – gemart
'CSV.foreach'는'each_slice'에 필요한 Enumerable을 반환하지 않습니다. 'File.read()'를 사용하지 않는 한,'CSV.parse'를 사용해도됩니다. 두 번째 경우에는 2000 줄만입니다. –
당신의 예제를 사용했고 424,000 수입 후에 heroku 콘솔에서'ETIMEDOUT : read ETIMEDOUT' 오류가 발생했습니다. 내가 어떻게 돌아갈 수 있는지 아십니까? – gemart