Tôi đang sử dụng rmongodb để lấy mọi tài liệu trong một bộ sưu tập cụ thể. Nó hoạt động nhưng tôi đang làm việc với hàng triệu tài liệu nhỏ, có khả năng 100M hoặc nhiều hơn. Tôi đang sử dụng phương pháp được đề xuất bởi các tác giả trên trang web: cnub.org/rmongodb.ashxtăng tốc độ xử lý tập hợp kết quả lớn bằng rmongodb
count <- mongo.count(mongo, ns, query)
cursor <- mongo.find(mongo, query)
name <- vector("character", count)
age <- vector("numeric", count)
i <- 1
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
name[i] <- mongo.bson.value(b, "name")
age[i] <- mongo.bson.value(b, "age")
i <- i + 1
}
df <- as.data.frame(list(name=name, age=age))
này hoạt động tốt cho hàng trăm hoặc hàng ngàn kết quả nhưng điều đó trong khi vòng lặp là rất rất chậm. Có cách nào để tăng tốc độ này không? Có lẽ một cơ hội để xử lý đa? Mọi lơi đê nghị đêu nên được đanh gia cao. Tôi trung bình 1M mỗi giờ và với tốc độ này, tôi cần một tuần để xây dựng khung dữ liệu.
EDIT: Tôi nhận thấy rằng nhiều vectơ trong vòng lặp while chậm hơn. Bây giờ tôi đang cố gắng lặp lại riêng biệt cho mỗi véc tơ. Tuy nhiên có vẻ như một hack, phải có một cách tốt hơn.
Chỉnh sửa 2: Tôi đang gặp may mắn với data.table. Nó vẫn chạy nhưng có vẻ như nó sẽ kết thúc 12M (đây là hiện tại tập kiểm tra của tôi) trong 4 giờ, đó là sự tiến bộ nhưng xa lý tưởng
dt <- data.table(uri=rep("NA",count),
time=rep(0,count),
action=rep("NA",count),
bytes=rep(0,count),
dur=rep(0,count))
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
set(dt, i, 1L, mongo.bson.value(b, "cache"))
set(dt, i, 2L, mongo.bson.value(b, "path"))
set(dt, i, 3L, mongo.bson.value(b, "time"))
set(dt, i, 4L, mongo.bson.value(b, "bytes"))
set(dt, i, 5L, mongo.bson.value(b, "elaps"))
}
Tôi không có lập trình viên r, infact Tôi chưa bao giờ sử dụng nó, tuy nhiên tại sao bạn không chọn các tập con dữ liệu bạn cần thay vì chỉ lặp lại toàn bộ bộ sưu tập và sau đó thực hiện xác nhận yêu cầu? Trong trường hợp này nó sẽ dễ dàng gửi nhanh hơn như 6 con trỏ phía máy chủ thay vì chỉ một. – Sammaye
Huh? Tất nhiên các vectơ nhiều hơn trong vòng lặp while chậm hơn. Còn nhiều việc phải làm. Vì vậy, phải mất nhiều thời gian hơn. Hay nó không tuyến tính? Nó hoạt động như thế nào với các giá trị khác nhau về số thứ bạn đang lặp lại? Hoặc bằng 'nhiều vectơ' hơn bạn có nghĩa là nhiều thứ hơn như tuổi tác và tên? Không rõ ràng. – Spacedman
@Sammaye, thats chính xác những gì tôi có nghĩa là bằng cách lặp riêng cho mỗi vector. Tôi đã thử đêm qua, đặt một cái đếm trong vòng lặp đó và dường như đã chết, nó dừng in sau vài giờ. Sự lúng túng chỉ là treo. Vì vậy, phương pháp này đã không giúp đỡ. – rjb101