2012-05-28 3 views
0

200k 레코드를 세 개의 다른 테이블에 삽입하려고합니다. CSV 파일을 구문 분석하고 이러한 레코드를 삽입하려고하면 Ruby가 전체 시스템을 잠급니다.CSV를 구문 분석하는 동안 200K 레코드를 삽입하면 시스템이 잠 깁니다.

def upload_country 
    @upload = Upload.new(:upload => params[:upload]) 
    if @upload.save 
    csv = CSV.parse(csv_text, :headers => true) 

    csv.each_with_index do |row, index| 
    unless row["name"].blank? or row["country_code"].blank? or row["destination"].blank? or row["code"].blank? 
     @country = Country.new(:name => row["name"].gsub(/\s+/, " ").strip, :country_code => row["country_code"].gsub(/\s+/, " ").strip, :user_id => current_user.id, :subscriber_id => get_subscriber_id) 
     @country.save 

     if row["country_code"] == "1" 
     p = @[email protected]+row["code"].gsub(/\s+/, " ").strip 
     else 
     p = @country.country_code.to_s+row["code"].gsub(/\s+/, " ").strip 
     end 

     @code = DestinationCode.create(:code => p, :country_destination_id => 1, :user_id => current_user.id) 
    end 
    end 

    @upload.destroy 
    @countries = Country.find_all_by_subscriber_id(get_subscriber_id) 
    render :partial => '/mycarriers/carrier_country', :layout => false 
end 
+1

요청을 도와 여기

이 희망 백그라운드 처리를 위해 resque으로 50 만 개 레코드를 삽입하는 나는 개인적으로 내 응용 프로그램에서 사용되는 탐구에서 당신을 도울 수있는 gem을 사용 대량 삽입을 사용하지 말아 수행하는데 오랜 시간이 걸린다. 200k 개의 오브젝트를 생성하고 삽입하는 것은 그렇게 빠르지 않을 것입니다. 대신에 일괄 적으로 삽입해야합니다. –

+0

좀 도와주세요 ??? – Kashiftufail

+0

코드 스 니펫에서 답을 제공하십시오. – Kashiftufail

답변

0

은 왜 당신에게

1

당신이 요청을 장기 실행 한 경우, 당신이 하나가 실행중인 인스턴스 레일에만있는 경우 다른 사용자가 그 시간에 응용 프로그램에 액세스 할 수 없습니다 것을 의미한다 : 여기 내 코드입니다.

백그라운드에서 긴 처리 작업을 수행하려면 delayed_job gem을 사용하는 것이 좋습니다. 컨트롤러 측에서는 작업을 대기열에 넣고 response 202 (Accepted)을 브라우저에 대기시켜야합니다. 클라이언트 측에서는 작업이 완료되었는지 여부에 관계없이 주기적으로 요청을 서버에 보내야합니다. 그에 따라 ui를 업데이트하십시오.

예로는 slideshare.net을 예로 들어주십시오. 사용자가 업로드를 완료하면 슬라이드 쉐어가 새 페이지로 리디렉션되고 ui가 프리젠 테이션 파일을 변환하는 동안 주기적으로 업데이트됩니다.

다른 해결책은 백그라운드에서 레이크 스크립트를 실행할 수 있다는 것입니다. railscasts에서 this episode을 확인하십시오.

관련 문제