2013-07-17 4 views
0

저는 Ruby와 Mongo를 처음 사용하고 트위터 데이터 작업을하고 있습니다. 저는 Ruby 1.9.3과 Mongo gem을 사용하고 있습니다.Mongo - Ruby에 대량 삽입

Mongo에서 대량 데이터를 쿼리하고, 일부 문서를 필터링하고, 남아있는 문서를 처리하고 (새 필드 삽입) Mongo에 새 문서를 쓰고 있습니다.

아래의 코드는 작동하지만 .each를 사용하여 반복하면서 비교적 느리게 실행되고 한 번에 하나씩 새 문서를 삽입합니다.

내 질문 : 어떻게 처리하여 일괄 적으로 삽입 할 수 있습니까?

cursor = raw.find({'user.screen_name' => users[cur], 'entities.urls' => []},{:fields => params}) 

cursor.each do |r| 
    if r['lang'] == "en" 
    score = r['retweet_count'] + r['favorite_count'] 
    timestamp = Time.now.strftime("%d/%m/%Y %H:%M") 

    #Commit to Mongo 
    @document = {:id => r['id'], 
       :id_str => r['id_str'], 
       :retweet_count => r['retweet_count'], 
       :favorite_count => r['favorite_count'], 
       :score => score,  
       :created_at => r['created_at'], 
       :timestamp => timestamp, 
       :user => [{:id => r['user']['id'], 
          :id_str => r['user']['id_str'], 
          :screen_name => r['user']['screen_name'], 
          } 
         ] 
       } 
    @collection.save(@document) 
    end #end.if 
end #end.each 

도움을 주시면 대단히 감사하겠습니다.

+0

모든 문서를 파일에 쓰고 시스템 명령'mongoimport -d -c

+0

그냥 정상적인 일들 : 색인을 끄고 write_concerns/안전 모드를 끄고 더 빠른 디스크에 넣으십시오 ... – WiredPrairie

답변

0

당신의 경우에는 훨씬 더 빨리 만들 방법이 없습니다. 당신이 할 수있는 한 가지 방법은 대량으로 문서를 검색하여 처리하고 대량으로 다시 삽입하는 것입니다.하지만 여전히 느립니다.

데이터를 빠르게 처리하려면 데이터가 이미 존재하는 모든 처리 서버 측을 수행해야합니다. 결과 문서 16메가바이트 또는 더 많은 유연성하지만 느린 실행 (솔루션이 가지고있는 잠재력보다 훨씬 더 빠른)에 대한을 초과하지 않는 경우

당신은 당신이 MapReduce framework of mongodb

0

정확히 무슨 을하고있다을 사용할 수있는 aggregate framework of mongodb를 사용해야 하나? 왜 순수한 루비 또는 순수한 몽고 (잘 루비도) 가지 않을까요? 왜 모든 단일 속성을로드해야합니까?

귀하의 코드에서 알 수있는 것은 실제로 완전히 새로운 문서를 만드는 것이고, 나는 그것이 잘못되었다고 생각합니다.

당신은 루비 옆에두고 있음을 수행 할 수 있습니다

에서

cursor = YourModel.find(params) 

cursor.each do |r| 
    if r.lang == "en" 
     r.score = r.retweet_count + r.favorite_count 
     r.timestamp = Time.now.strftime("%d/%m/%Y %H:%M") 
     r.save 
    end #end.if 
end #end.each 

그리고 당연히 당신이 모델의 include Mongoid::Timestamps를 가져올 수 있으며, 그것은 당신의 created_at 처리하고 updated_at 속성 (그들 자체를 생성) mongoid 조금 더 어려움 먼저 컬렉션을 use my_db으로 가져오고 다음 코드는 원하는 것을 생성합니다

db.models.find({something: your_param}).forEach(function(doc){ 
    doc.score = doc.retweet_count + doc.favorite_count 
    doc.timestamp = new Timestamp() 
    db.models.save(doc) 
    } 
); 

매개 변수는 무엇인지 모르겠지만 쉽게 만들 수 있으며 mongoid는 실제로 게으른 로딩을 수행하므로 속성을 사용하려고하지 않으면로드되지 않습니다. 실제로 모든 속성을 사용하지 않고 많은 시간을 절약 할 수 있습니다. 그리고이 방법은 기존 문서를 변경하고 다른 문서를 만들지 않습니다.