2012-02-13 4 views
2

데이터 제공 업체가 분기별로 제공하는 텍스트 문서를 기반으로 작성한 약 3 천만 개의 행이있는 레일 앱이 있습니다. 거기에서 나는 다른 테이블과 조작 및 비교를 수행하고 사용자 정의 된 데이터로 추가 테이블을 작성합니다.레일 앱에서 대량의 데이터 업데이트하기

처음이 작업을 할 때 레일즈 콘솔을 통해 루비 스크립트를 실행했습니다. 이것은 느리고 분명히 최선의 방법은 아닙니다.

이 프로세스를 간소화하고 가동 중단 시간이 거의 없거나 최소한 다운 타임이없는 프로덕션 서버에서 업데이트하는 가장 좋은 방법은 무엇입니까?

이 내가 생각하고 과정이 지금은 최고입니다 :

  1. 이 데이터를 읽기 위해 레이크 작업을 만듭니다. activerecord-import 플러그인을 사용하여 배치 쓰기를 수행하고 activerecord 유효성 검사를 비활성화하십시오. 이 데이터를 새로운 중복 테이블에로드하십시오.

  2. 새로 생성 된 테이블에 대한 색인을 작성하십시오.

  3. 새로 만든 테이블의 이름을 레일스 응용 프로그램이 찾고있는 이름으로 변경하십시오.

  4. 오래된 것을 삭제하십시오.

이 모든 것을 프로덕션 서버에서 올바르게 수행 할 계획입니다.

더 좋은 방법이 있나요? 댓글에서

기타 사항 :

  • 테이블은 이미
  • 오래된 테이블과 데이터가 일회용
  • 표는
  • 다운 타임을
  • 우리의 현재 서버 상황을 최소화해야 선택을 위해 고정 될 수있는 존재 2 개의 높은 CPU Amazon EC2 인스턴스입니다. 나는 그들이 1.7GB의 RAM을 가지고있어 전체 수입을 일시적으로 저장하는 것이 아마도 선택이 아니라고 생각한다.
  • 새 데이터는 줄 바꿈 텍스트 파일입니다. 이미 Ruby로 작성된 구문 분석 용 스크립트가 있습니다.
+0

resque 또는 delayed-job을 사용하여 백그라운드 작업으로 가져 오기를 실행할 수 있습니다.이 작업을 수행 할 때 서둘러 서버를 느리게하거나 서버 속도를 줄이지 마십시오. – nodrog

+0

서둘러 조금. 저는 지금까지 3 개월마다 한 번씩 '영원히해야 할 것입니다. 가장 고통스럽고 자동화 된 프로세스를 마련하는 것이 더 중요합니다. – Patm

+0

가능한 경로는 정확한 요구 사항에 따라 다릅니다. 필요한 테이블이 이미 있습니까? 구조가 항상 바뀌 었습니까? 테이블에 이전 데이터가 필요합니까? 새 데이터가 테이블의 이전 내용을 완전히 대체합니까? 테이블을 독점적으로 잠글 수 있습니까? 다운 타임을 최소화해야합니까? 가져온 전체 데이터를 일시적으로 보관할 수있는 충분한 RAM이 있습니까? –

답변

1

1) my_new_table에) × 라인의 일괄 파일을 (수입) 2 "MY_TABLE"의 빈 복제로 "my_table_new"만들 - 당신이 가서 내장 인덱스. 3) 실행 : RENAME TABLE my_table TO my_table_old, my_table_new to my_table;

하나의 명령으로이 작업을 수행하면 (즉, 충분히 가까워 지므로) 실질적으로 중단 시간이 발생하지 않습니다. 큰 데이터 세트를 사용하여이 작업을 수행했으며, 이름이 '스위치'인 경우 가동 시간을 유지해야합니다.

+0

테이블/열 자물쇠가 있으면 실패 할 것이고, 우리는 모든 작업자의 전원을 껐다가 다시 켰습니다. 서버가 잠금을하고 있다면 바쁜 시간이 아닌 시간을 찾아 패스 할 때까지 실행하십시오. – TomDunning

1

논리에 따라 SQL을 사용하여 데이터베이스의 데이터 처리를 진지하게 고려할 것입니다. 이것은 데이터에 가깝고 30m 행은 일반적으로 데이터베이스에서 꺼내고 데이터베이스에서 꺼낸 다른 데이터와 비교하려는 것이 아닙니다.

그래서 Ruby on Rails 상자 밖에서 생각해보십시오.

SQL에는 데이터를 조인하고 데이터를 비교하고 테이블을 삽입 및 업데이트 할 수있는 기능이 내장되어있어 이러한 기능이 매우 강력하고 빠르며 데이터 가까이에서 데이터를 처리 할 수 ​​있습니다.

관련 문제