Il mio punto di riferimento:
== generazione dati ==
Generare 4 milioni di file (con python) facile con circa 350 byte. Ogni documento ha queste chiavi:
- tasto1, key2 (due colonne casuali per testare indicizzazione, uno con cardinalità del 2000, e uno con cardinalità 20)
- longdata: una lunga serie per aumentare la dimensione di ciascun documentare
- valore: un numero semplice (const 10) per testare l'aggregazione
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)
dimensione dei dati totale era circa 6GB in Mongo. (E 2GB in Postgres)
Test == ==
ho fatto qualche test, ma uno è sufficiente per i risultati a confronto:
NOTA: Server viene riavviato, e la cache del sistema operativo viene pulito dopo ogni query, per ignorare l'effetto della memorizzazione nella cache.
DOMANDA: aggregate tutte le righe con key1=somevalue
(circa 200K righe) e sommare value
per ciascuna mappa key2
- /ridurre 10,6 sec
- aggreate 9.7 sec
- gruppo 10,3 sec
domande:
mappa/ridurre:
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'} })
aggregato:
db.testtable.aggregate({ $match: {key1: '663969462d2ec0a5fc34'}}, {$group: {_id: '$key2', pop: {$sum: '$value'}} })
gruppo:
db.testtable.group({key: {key2:1}, cond: {key1: '663969462d2ec0a5fc34'}, reduce: function(obj,prev) { prev.csum += obj.value; }, initial: { csum: 0 } })
"quasi" lo stesso? Con quali parametri? La tua osservazione è fondamentalmente inutile. E stai confrontando gatto e mucche. Inoltre, sai che il MR è ancora limitato al single-threading .... quindi: domanda inutile e quindi -1 –
@ user1833746 È una domanda, non voglio spiegare i miei benchmark. Ho chiesto di conoscere nuove risposte a questo interrogato. Si prega di votare per consentire agli altri di rispondere. –
hai visto questa domanda (e le risposte)? http://stackoverflow.com/questions/12139149/mapreduce-with-mongodb-really-really-slow-30-hours-vs-20-minutes-in-mysql-for –