J'ai une base de données CouchDB avec une vue dont les valeurs sont des nombres appariés de la forme [x, y]. Pour les documents avec la même clé, j'ai besoin (simultanément) de calculer le minimum de x et le maximum de y. La base de données avec laquelle je travaille contient environ 50000 documents. Construire la vue prend plusieurs heures, ce qui semble un peu excessif. (Les clés sont elles-mêmes des tableaux de trois longueurs.) Je montre la carte et réduit les fonctions ci-dessous, mais la question fondamentale est: comment puis-je accélérer ce processus?plus rapide min et max de différents composants de la baie avec CouchDb map/reduce?
Notez que les fonctions intégrées ne fonctionneront pas car les valeurs doivent être des nombres, pas des tableaux de longueur. Il est possible que je puisse faire deux vues différentes (une pour min (x) et une pour max (y)), mais je ne vois pas comment les combiner pour obtenir les deux résultats simultanément.
Ma fonction actuelle carte ressemble fondamentalement
function(doc) {
emit ([doc.a, doc.b, doc.c], [doc.x, doc.y])
}
et ma fonction reduce ressemble
function(keys, values) {
var x = null;
var y = null;
for (i = 0; i < values.length; i++) {
if (values[i][0] == null) break;
if (values[i][1] == null) break;
if (x == null) x = values[i][0];
if (y == null) y = values[i][1];
if (values[i][0] < x) x = values[i][0];
if (values[i][1] > y) y = values[i][1];
}
emit([x, y]);
}
Je n'avais pas essayé Math.max parce que je ne savais pas comment il traitait null. (Je travaille beaucoup dans R, où l'équivalent le plus proche de null est NA, qui absorbe tous les nombres dans les opérations arithmétiques.) Exécuter un test, cependant, confirme que Math.max ignore les valeurs nulles, et fonctionne donc ici. –
Pas exactement. Math.max n'ignore pas null, il le traite comme 0. Par exemple: "Math.max (null, 1) == 1", "Math.max (null, -1) == 0". Tous les tests suivants sont vrais: "-1 -1" et "null> = 0". C'est pourquoi j'ai utilisé -Infinity comme valeur de départ. –