많은 문서 (> 100M)를 쿼리해야하며 문서 5000 개 (각각 4-5MB)를 요청하고 있습니다. 어떤 이유로 인해 나머지가 상당한 시간 (~ 8-9.5 초)을 걸리는 동안 첫 번째 요청 (_id
필터링없이)은 빠르게 (~ 1.5 초) 반환됩니다.MongoDB 처음 읽은 후 느리게 읽음
이제 500 개의 문서 (각각 ~ 500kB)를 일괄 적으로 읽으면 타이밍이 상당히 좋아지며 (0.5-0.8 초) 모든 요청에 일관됩니다.
나는 skip + limit
메서드가 훨씬 성능이 떨어지는 것을 보았으므로 _id + limit
페이지 매김 방법을 사용하고 있습니다.
다음은 내 프로세스 샘플입니다.
var mongodb = require("mongodb")
var bytes = require("bytes")
...
var filter = {
'_id': { '$gt': this._lastId }
}
if(mongodb.ObjectId.isValid(this._lastId)) {
filter['_id'] = { '$gt': this._lastId }
}
var cursor = this.conn.collection(collectionName)
.find(filter)
.limit(5000)
var start = new Date().getTime()
cursor.toArray(function(err, docs) {
if (err) { ... }
var elapsed = (new Date().getTime() - start)/1000
console.log(
"Docs:", docs.length,
"Size:", bytes(sizeof(docs)),
"Took:", elapsed + " seconds"
)
var lastDoc = docs[docs.length - 1]
this._lastId = lastDoc._id
})
...
일괄 처리 크기가 250에서 500 사이이면 최상의 결과를 얻을 수 있습니다. 5000의 배치가 너무 많아서 MongoDB 드라이버가 내부적으로 최대 1000의 크기로 나눕니다. – Saleem