2009-10-16 2 views
2

업로드 된 파일을 모델로 가져 오는 데 FasterCSV를 사용하고 있습니다.이 파일은 작은 파일에 적합합니다. 그러나 큰 데이터 세트 (21,000 라인)를 가져 오려고하면 수명이 오래 걸리고 라이브 서버에서 브라우저 시간 초과가 발생합니다.CSV를 레일스의 행 배치로 가져 오시겠습니까?

이 내 현재 작업 코드 :

logcount=0 
    Attendee.transaction do 
    FCSV.new(file, :headers => true).each do |row| 
     row[1] = Date.strptime(row[1], '%m/%d/%Y') 
     record = @event.attendees.new(:union_id => row[0], :dob => row[1], :gender => row[2]) 
     if record.save 
     logcount += 1 
     end 
    end 
    end 

나는 백그라운드 프로세스를 사용 싶지만, 사용자가 시스템의 다음 단계로 이동하기 전에 수입 얼마나 많은 라인을 볼 필요 .

따라서 action chunking을 사용하고 더 적은 수의 행을 읽고 카운터를 설정 한 다음 몇 가지 종류의 진행률로보기를 업데이트 한 다음 이전 카운터를 시작점으로 사용하여 다시 메서드를 실행해야한다고 생각했습니다.

FasterCSV에서 설정된 수의 행만 읽는 방법과 시작점의 오프셋을 설정하는 방법을 볼 수 없습니다.

누구든지이 작업을 수행하는 방법을 알고 있습니까? 아니면 이것을 처리 할 수있는 더 좋은 방법이 있습니까?

답변

2

일괄 가져 오기에 AR Extensions을 사용해 보셨나요? 1000 개의 행을 DB에 삽입하면 성능이 크게 향상됩니다. 자세한 내용은 website을 방문하십시오.

+0

이 죽은 링크를 보는 사람 : https://web.archive.org/web/20080729041651/http://www.continuousthinking.com/tags/arext – MaicolBen

0

필자는 준비된 쿼리를 만들고 파일에서 한 줄을로드하고 준비된 쿼리를 실행하려고합니다. 모델을 전혀 사용하지 않으면 빠릅니다.

+0

무슨 뜻인지 예를 들어 주시겠습니까? 브라우저에 업데이트를 보내지 않아도 될만큼 빠르다고 생각하십니까? – Les

+0

가져올 21000 개의 레코드가 없습니다. – EmFi

0

데이터베이스가 있다면 왜 레이크 작업을 통해 가져 오지 않을까요? 사용자가 대형 데이터베이스를 가져오고 있습니까?

사용자가 이러한 대용량 데이터베이스를 가져 오려는 경우에는 작업이 수행되지 않습니다.

FCSV.new는 IO.open 옵션을 사용할 수 있습니다. 이를 사용하여 특정 바이트를 찾을 수 있습니다. 유감스럽게도 FCSV를 사용하면 기본 IO 객체를 중지하거나 액세스하여 중단 한 위치를 쉽게 알 수 없습니다. 파일의 중간에서 다시 시작하면 헤더 행을 사용하기가 복잡해집니다.

정말 제가 생각하기에 최적의 솔루션은 CSV 가져 오기를 drb에 아웃소싱하는 것입니다. 컨트롤러에서 작업을 수행 할 수있는 방법으로 진행 상황을 정기적으로보고합니다. 그런 다음 AJAX를 클라이언트에서 실행하면서 컨트롤러 액션을 자주 호출하십시오.

저는 과거에 BackgroundDRb으로 성공했습니다. 설치 및 사용법은 여기에서 재현하기에 너무 자세합니다. 몇 가지 인터넷 검색을 통해 사용할 수있는 다른 플러그인과 보석이 있습니다.

DRb 경고 대부분의 DRb 솔루션에는 서버에서 실행중인 추가 데몬 프로세스가 필요합니다. 일부 웹 호스트는 더 기본적인 계획에서 이것을 금지합니다. 귀하의 서비스를 확인하십시오