2

레일 app을 개발 중입니다. 나는 다음과 같이 데이터베이스에 데이터를 다음 2,000,000 데이터를 개최 배열을 사용하여 삽입 할 : 나는이 코드를 실행하면배열의 큰 데이터

large_data = Get_data_Method() #get 2,000,000 raw data 

all_values = Array.new 

large_data.each{ |data| 

    all_values << data[1] #e.g. data[1] has the format "(2,'john','2002-09-12')" 

} 

sql="INSERT INTO cars (id,name,date) VALUES "+all_values.join(',') 

ActiveRecord::Base.connection.execute(sql) 

, 그것은 large_data.each{...}의 지점에 긴 시간이 오래 걸립니다. 실제로 나는 아직도 그것을 끝내기를 여전히 기다리고있다. (그것은 이미 1 시간 동안 실행되어 아직 large_data.each{...} 부분을 끝내지 못했다.)

배열 수없는 루비 배열의 요소 수가 너무 많아 2,000,000 요소입니까? 또는 루비 배열은 그 많은 요소를 수용 할 수 있으며, 그렇게 오래 기다리는 것이 합리적입니다. 나는 위의 일을 한 이유

내가 MySQL 데이터베이스에 큰 데이터 삽입 시간을 단축하기 위해 SQL에 대량 삽입를 사용하고 싶습니다, 그래서 하나의 INSERT INTO 문을 사용하고자하기 때문에, 즉이다. 이것이 나쁜 디자인이라면, 나에게 더 좋은 방법을 권할 수 있습니까?

+0

사소한 질문 : 당신의 모든 라인 사이에 빈 줄을 남겨 할 암호? – tokland

+0

이 데이터는 어디에서 가져 옵니까? 왜 그것을'large_data'에서'all_values'로 옮깁니 까? –

답변

2

일부 노트 :

패턴 "빈 배열 + 각 + 푸시"를 사용하지 마십시오, Enumerable#map를 사용합니다.

all_values = large_data.map { |data| data[1] } 

지연 반품을 위해 get_data을 쓸 수 있습니까? 대답이 '예'인 경우 enumerators을 확인한 다음 모든 개체를 한 번에 배치하는 대신 데이터베이스에 배치 삽입을 수행하는 데 사용하십시오. 이런 식으로 뭔가 : 레일 말했다

def get_data 
    Enumerator.new do |yielder| 
    yielder.yield some_item 
    yielder.yield another_item 
    # yield all items. 
    end 
end 

get_data.each_slice(1000) do |data| 
    # insert those 1000 elements into the database 
end 

,이 효율적인 대량 삽입 작업을 수행하는있는 거 프로젝트 확인 ar-extensionsactiverecord-import> = 3

+0

내 경우지도를 사용하여보다 자세히 설명해 주실 수 있습니까? 왜지도가 더 좋은지, 그리고 두 번째 링크가 깨졌습니다. – Mellon

+0

이 더 많은 예제로 편집되었습니다. 나는지도가 더 나은 이유를 알 것입니다. 목록에서 단일 요소를 처리하는 바로이 작업을 위해 설계된 것입니다. 함수 프로그래밍의 가장 기본적인 추상화 중 하나입니다. http://code.google.com/p/tokland/wiki/RubyFunctionalProgramming – tokland

+0

https://github.com/zdennis/activerecord-import는 Rails> = 3을 사용할 때 대량 데이터 가져 오기를 수행하는 가장 좋은 방법입니다. – cvshepherd

1

2m 항목의 배열은 결코 관리하기 쉽지 않습니다. MongoDB을 살펴 보았습니다.이 배열은 배열과 마찬가지로 액세스 할 수 있으며 문제의 해답이 될 수 있습니다.

삽입물을 1000 개의 블록으로 분할하면 전체 프로세스를 더 쉽게 관리 할 수 ​​있습니다.