MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Có thể cải thiện tốc độ Mongoexport không?

Có nhiều yếu tố đang hạn chế hoạt động xuất khẩu.

  • Kích thước dữ liệu tương đối lớn so với bộ nhớ khả dụng:~ 2 TB so với ~ 5 GB bộ nhớ cache WiredTiger (nếu được đặt thành mặc định). Đó là:
    • Toàn bộ bộ nhớ cache của WiredTiger chỉ có thể chứa tốt nhất là ~ 0,22% bộ sưu tập, trong thực tế, nó rất có thể ít hơn nhiều so với mức này vì bộ nhớ cache sẽ chứa dữ liệu từ các bộ sưu tập và chỉ mục khác.
    • Điều này có nghĩa là WiredTiger cần phải tìm nạp từ đĩa rất thường xuyên, đồng thời loại bỏ nội dung hiện tại của bộ nhớ cache. Nếu tập hợp bản sao đang được sử dụng tích cực, điều này có nghĩa là loại bỏ dữ liệu "bẩn" khỏi bộ nhớ cache và lưu chúng vào đĩa, điều này sẽ mất thời gian.
    • Lưu ý rằng các tài liệu bên trong bộ đệm WiredTiger không được nén.
  • Bộ sưu tập chứa các tài liệu lớn mà bạn chỉ cần một phần của nó. Điều này có nghĩa là cần thêm thời gian để xử lý tài liệu.
  • Bộ sưu tập được nén bằng zlib, có nghĩa là phải sử dụng thêm thời gian để giải nén tài liệu.
  • readPreference là secondaryPreferred , nghĩa là nó sẽ cố gắng đọc từ phụ. Nếu tập hợp bản sao đang được chủ động ghi vào, các thao tác áp dụng oplog trên phần phụ sẽ chặn trình đọc. Điều này sẽ làm tăng thêm độ trễ.

Một cải tiến có thể xảy ra là nếu đây là thao tác bạn thực hiện thường xuyên, hãy tạo chỉ mục trên các trường liên quan và xuất nó bằng cách sử dụng truy vấn được bao phủ có thể cải thiện hiệu suất vì chỉ mục sẽ nhỏ hơn các tài liệu đầy đủ.

Chỉnh sửa:Đang chạy mongoexport song song có thể hữu ích trong trường hợp này:

Ngoài thông tin bổ sung được cung cấp, tôi đã chạy thử nghiệm có vẻ như giúp giảm bớt phần nào vấn đề này.

Có vẻ như đang chạy mongoexport song song, trong đó mỗi mongoexport xử lý một tập hợp con của bộ sưu tập có thể tăng tốc độ xuất.

Để thực hiện việc này, hãy chia _id vùng tên tương ứng với số lượng mongoexport quy trình bạn định chạy.

Ví dụ:nếu tôi có 200.000 tài liệu, bắt đầu bằng _id:0 thành _id:199,999 và sử dụng 2 mongoexport quy trình:

mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &

trong ví dụ trên, hai mongoexport mỗi quy trình xử lý một nửa của bộ sưu tập.

Kiểm tra quy trình công việc này với 1 quy trình, 2 quy trình, 4 quy trình và 8 quy trình, tôi đến các thời điểm sau:

Sử dụng 1 quy trình:

real    0m32.720s
user    0m33.900s
sys 0m0.540s

2 quy trình:

real    0m16.528s
user    0m17.068s
sys 0m0.300s

4 quy trình:

real    0m8.441s
user    0m8.644s
sys 0m0.140s

8 quy trình:

real    0m5.069s
user    0m4.520s
sys 0m0.364s

Tùy thuộc vào tài nguyên có sẵn, chạy 8 mongoexport các quá trình song song dường như tăng tốc quá trình lên một hệ số ~ 6. Điều này đã được thử nghiệm trong một máy có 8 lõi.

Lưu ý :câu trả lời của halfer có ý tưởng tương tự, mặc dù câu trả lời này về cơ bản cố gắng xem liệu có bất kỳ lợi ích nào khi gọi mongoexport song song.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. đợi các triển khai khác bắt đầu chạy trước khi có thể tạo khác?

  2. Mongodb tổng kích thước của các trường mảng

  3. Làm thế nào để sắp xếp các tài liệu con trong trường mảng?

  4. Kiểm tra tích hợp với MongoDB?

  5. Bao gồm các trường trong mongodb tổng hợp