2013-05-07 4 views
0

수천 개의 행이있는 Excel 파일이 있습니다. 필자의 경우 벌크 삽입을 사용할 수 없습니다. 왜냐하면 각 행마다 연관성을 거의 만들지 않아야하기 때문입니다. 이제는 모든 프로세스가 20k 행으로 1 시간 이상 걸립니다. 이는 지옥입니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?거대한 Excel 파일을 Rails 응용 프로그램으로 가져 오기

저는 스프레드 시트 젬을 사용하고 있습니다.

+1

Resque, 지연된 작업, 단순 대기열 또는 Sidekq와 같은 대기열 처리 메커니즘을 고려 했습니까? –

+0

이것은 궁극적 인 솔루션입니다. 요청시 더 많은 것을 선호합니다. – Meliborn

답변

4

이것은 레일스가 만나는 것이 좋지 않은 악명 높은 "1 + N"쿼리 상황과 유사합니다. 비슷한 상황이 있습니다 (여러 연관이있는 20k + 행 파일 가져 오기). 이 프로세스를 최적화 한 방식은 연결에 해시를 미리로드하는 것이 었습니다. 이 객체의 해시를 제공

associated_model_hash = Hash.new(:not_found) 

AssociatedModel.each do |item| 
    associated_model_hash[item.lookup_column] = item 
end 

: 그래서 예를 들어, 당신은 AssociatedModel이있는 경우 가져 오기 데이터에있는 lookup_column, 당신은 먼저 해시를 구축 할 것입니다 포함 된. 당신은 당신이 가진만큼 많은 협회를 위해 반복 할 수 있습니다. 가져 오기 루프에서 :

associated_model = associated_model_hash[row[:lookup_column]] 
new_item.associated_model_id = associated_model.id 

매번 데이터베이스를 검색 할 필요가 없기 때문에 훨씬 빠릅니다. 또한 대량 삽입을 사용할 수 있어야합니다 (로드 중에 연결된 모델이 잘못 삭제되거나 수정되지 않는다고 가정 할 경우).

+0

좋은 대답은, MVC가 아닌 시스템에서 PHP/MySQL에서 많은 문제를 겪고 있습니다. 나는 잠시 동안 N + 1을 피하는 방법을 궁금해왔다. 해답에 추가 할 가치가있는 것은 다음과 같습니다. not_found는 ActiveRecord :: RecordNotFound의 심볼이므로 유효하지 않은 키가 해시에 전달되면 해시가 반환하지 않는 값이됩니다. 해시가 어떻게 작동했는지 알았지 만 조회해야했습니다 : not_found => ActiveRecord :: RecordNotFound는 최근에 레일스로 돌아 왔습니다. – Axiombadger

관련 문제