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.