2013-11-01 2 views
2

나는 데이터를 저장하기 위해 MongoDB를 사용하고 있습니다. 나는 멋지게 덩어리로 만들어진 데이터를 넣을 것이지만 하나의 큰 덩어리로 쉽게 결합 될 수 있고 한꺼번에 모두 밀어 넣을 수 있습니다.MongoDB 많은 작은 업로드 대 하나의 큰 업로드

한 번에 모든 데이터를 푸시하는 것이 유리합니까? 또는 각 청크를 개별적으로 푸시해야합니까?

또한 한 번에 누를 수있는 데이터 양에 대한 제한이 있습니까? 한 번에 모든 것을 푸는 것은 ~ 30MB이고, 각 청크는 ~ 10KB뿐입니다. 두 경우 모두 동일한 수의 문서 (문서 당 < 1KB)를 저장하게됩니다. 나는 pymongo를 사용하고 있습니다.

+0

격자 형 저장 장치를 사용하거나 일반 문서를 저장하고 있습니까? 개별 문서는 최대 16MB 크기 여야합니다. –

+0

@TomSwifty 여러 문서로 구성된 각 청크와 함께 일반 문서를 저장합니다. –

+0

그래서 많은 단일 문서 삽입물이나 그와 비슷한 것보다 많은 수의 삽입물을 만드는 것이 더 효율적인지 궁금합니다. –

답변

2

은 세 가지 주요 고려 사항이 있습니다

  1. 작은 배치에 와이어를 통해 문서를 보내는 오버 헤드. 예 : 문서를 보내기 위해 보낼 데이터가 얼마나 더 필요합니까?
  2. 인서트가 승인 될 때까지 대기하기 때문에 추가로 대기 시간이 얼마나 더 지연됩니까?
  3. 더 많은 문서가 포함 된 큰 메시지가 서버에 삽입을 수행하는 데 더 많은 시간이 걸리므로 서버가 "잠김"상태 인 것으로 나타났습니다.

사이즈 오버 "."

전송 인서트 메시지 20 바이트의 오버 헤드 수정 더한 길이를 가지고 끈. 수십 MB 범위의 단일 메시지 크기에는 제한이 있으므로 일부 데이터 전송 공간을 절약 할 수 있지만 1KB 문서에서는 오버 헤드 비율이 이미 무시할 수 있습니다.

대기 시간 :

은 서버에 클라이언트의 "네트워크 거리"에 따라이 훨씬 더 큰 영향을 미칠 수 있습니다. 비동기 드라이버는 삽입 메시지를 보낸 다음 응답을 기다립니다. 여기에는 삽입을 수행하는 시간과 서버에 메시지를 보내고 응답을받는 시간이 포함됩니다. 빠른 1/4 ms 라운드 트립 로컬 네트워크에서도 3,000 개의 메시지 (30MB/10KB)를 전송하면 대기 시간이 750ms가됩니다. 클라이언트가 "원격"이고 10 밀리 초 핑 (ping) 시간이 있으면 우리는 30 초를 기다리고 있습니다. 비동기 드라이버는 더 많은 요청을 보내 대기 시간을 채울 수 있습니다.

서버 잠금 업 :

서버 소요 시간 및 시간의 긴 기간 동안 데이터베이스 잠금을 보유 할 하나 개의 배치에서 더 많은 문서를 삽입한다. 이렇게하면 쓰기가 완료되는 동안 데이터베이스와의 모든 다른 상호 작용이 중지됩니다 (예 : 인덱스 업데이트 등). 서버가 쓰기를 수행하는 동안 작업량에 따라 유도 된 일시 중지로 인해 다른 작성자 및 독자에게 원하지 않는 문제가 발생할 수 있습니다. 삽입을 일괄 처리 할 때 주요 단점 : 삽입이 실패하면 어떤 실패인지 전혀 알 수 없습니다. 서버는 오류를 반환 할 수는 있지만 어떤 문서가 실패했는지는 알려주지 않습니다. 서버가 "오류 발생시 계속 진행"할 수 있지만 . 상황 소폭 더 나은

내가 파이썬 드라이버에 Motor 확장을 살펴 가지고하는 것이 좋습니다 것입니다 수 있습니다 그것은 당신을 허용해야합니다.

  1. 각 요청에 대한 응답을 기다리지 않고 동일한 연결에서 여러 요청을 보내 대기 시간 문제가 발생합니다.
  2. 각 인서트를 별도의 요청으로 보내어 각각에 대해 어떤 일이 발생하는지 알 수 있습니다.
  3. 그리고 다른 읽기 및 쓰기가 생성중인 쓰기와 자연스럽게 인터리브 할 수 있습니다.

HTH, 롭

전체 공개 : 나는 Java Asynchronous Driver에서 작동하지만, 비동기 드라이버가 목록 위의 혜택을 제공 할 수 있어야한다.