2012-12-17 24 views
50

Khung công tác tổng hợp có được giới thiệu trong Mongodb 2.2 không, có bất kỳ cải tiến hiệu suất đặc biệt nào trên bản đồ/giảm không?Khuôn khổ tập hợp Mongodb có nhanh hơn bản đồ/giảm không?

Nếu có, tại sao và như thế nào và bao nhiêu?

(Đã tôi đã thực hiện một thử nghiệm cho bản thân mình, và hiệu suất gần như giống nhau)

+1

"gần như" giống nhau? Với điểm chuẩn nào? Nhận xét của bạn về cơ bản là vô nghĩa. Và bạn đang so sánh mèo và bò. Ngoài ra bạn biết bản thân rằng MR vẫn còn giới hạn cho luồng đơn .... vì vậy: câu hỏi vô nghĩa và do đó -1 –

+0

@ user1833746 Đó là một câu hỏi, tôi không muốn giải thích các tiêu chuẩn của mình. Tôi đã hỏi để biết câu trả lời mới cho câu hỏi này. Hãy bỏ phiếu để cho phép người khác trả lời. –

+0

bạn có thấy câu hỏi này (và câu trả lời) không? http://stackoverflow.com/questions/12139149/mapreduce-with-mongodb-really-really-slow-30-hours-vs-20-minutes-in-mysql-for –

Trả lời

61

Mỗi bài kiểm tra tôi đã đích thân chạy (kể cả sử dụng dữ liệu của riêng bạn) cho thấy khung tổng hợp là một hệ số e nhanh hơn bản đồ giảm, và thường là một thứ tự cường độ nhanh hơn.

Chỉ cần lấy 1/10 dữ liệu bạn đã đăng (nhưng thay vì xóa bộ nhớ cache của hệ điều hành, hãy làm mới bộ đệm trước - vì tôi muốn đo hiệu suất của tập hợp và không mất bao lâu để trang trong dữ liệu) nhận điều này:

MapReduce: 1,058ms
aggregation khung: 133ms

Tháo $ trận đấu từ khuôn khổ hợp và {query:} từ MapReduce (vì cả hai sẽ chỉ sử dụng một chỉ số và đó không phải là những gì chúng ta muốn để đo lường) và nhóm toàn bộ tập dữ liệu theo key2 Tôi nhận được:

MapReduce: 18,803ms
Aggregation Khung: 1,535ms

Đó là rất nhiều phù hợp với các thí nghiệm trước đây của tôi.

+0

để có thêm nhận xét về việc này, hãy xem câu trả lời cho http://stackoverflow.com/questions/12139149/mapreduce-with-mongodb-really-really-slow-30-hours-vs-20-minutes-in-mysql-for –

+0

Cảm ơn để trả lời phần đầu tiên của câu hỏi! Còn phần thứ hai thì sao? Lý do tại sao và làm thế nào? Bạn có gì để thêm cho điều đó không? Cảm ơn bạn cho bất kỳ đầu vào. – Jeach

+1

điều này được đề cập trong tài liệu - nhưng tóm lại, tập hợp chạy tự nhiên trong máy chủ (C++), MapReduce sinh ra các chuỗi javascript riêng biệt để chạy mã JS. –

7

benchmark của tôi:

== dữ liệu thế hệ ==

Tạo 4million hàng (với trăn) dễ dàng với khoảng 350 byte. Mỗi tài liệu có các phím:

  • key1, key2 (hai cột ngẫu nhiên để kiểm tra lập chỉ mục, một với cardinality của năm 2000, và một với cardinality của 20)
  • longdata: một chuỗi dài để tăng kích thước của mỗi tài liệu
  • giá trị: một số đơn giản (const 10) để kiểm tra tập hợp

 
db = Connection('127.0.0.1').test # mongo connection 
random.seed(1) 
for _ in range(2): 
    key1s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(10)] 
    key2s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(1000)] 
    baddata = 'some long date ' + '*' * 300 
    for i in range(2000): 
     data_list = [{ 
       'key1': random.choice(key1s), 
       'key2': random.choice(key2s), 
       'baddata': baddata, 
       'value': 10, 
       } for _ in range(1000)] 
     for data in data_list: 
      db.testtable.save(data) 
Tổng kích thước dữ liệu vào khoảng 6GB ở Mông Cổ. (Và 2GB trong postgres)

thử nghiệm == ==

tôi đã làm một số kiểm tra, nhưng một là đủ để kết quả so sánh:

LƯU Ý: Server được khởi động lại, và OS nhớ cache được làm sạch sau mỗi truy vấn, bỏ qua hiệu ứng của bộ nhớ đệm.

QUERY: tổng hợp tất cả các hàng với key1=somevalue (khoảng 200K hàng) và tổng value cho mỗi bản đồ key2

  • /giảm 10,6 giây
  • aggreate 9,7 giây
  • nhóm 10,3 giây

truy vấn:

bản đồ/giảm:

db.testtable.mapReduce(function(){emit(this.key2, this.value);}, function(key, values){var i =0; values.forEach(function(v){i+=v;}); return i; } , {out:{inline: 1}, query: {key1: '663969462d2ec0a5fc34'} })

tổng hợp:

db.testtable.aggregate({ $match: {key1: '663969462d2ec0a5fc34'}}, {$group: {_id: '$key2', pop: {$sum: '$value'}} })

nhóm:

db.testtable.group({key: {key2:1}, cond: {key1: '663969462d2ec0a5fc34'}, reduce: function(obj,prev) { prev.csum += obj.value; }, initial: { csum: 0 } })

+4

nhóm không phải là khung tổng hợp, đó là một phần của bản đồ/giảm. Đó là lý do tại sao nó có chức năng giảm. Xem sự khác biệt ở đây: http://docs.mongodb.org/manual/reference/command/group/ và http://docs.mongodb.org/manual/reference/aggregation/group_group_#_S_group Nếu bạn đang sử dụng khung kết hợp, bạn sẽ được gọi db.collection.aggregate ([pipeline]) –

+0

Tôi có một gợi ý: tại sao bạn không đưa ra các truy vấn và chạy cùng một điều trên toàn bộ bộ sưu tập của bạn và xem nếu có một sự khác biệt trong hiệu suất. –

+3

một vấn đề khác với điểm chuẩn của bạn là bạn xóa bộ đệm ẩn của hệ điều hành? Vì vậy, bạn đã đo chủ yếu là thời gian cần để trang dữ liệu vào RAM. Nó làm giảm số hiệu suất thực tế, và nó không phải là một kịch bản thực tế. –

Các vấn đề liên quan