быстрее мин и макс различных компонентов массива с CouchDb карту / уменьшить? - PullRequest
3 голосов
/ 09 марта 2011

У меня есть база данных CouchDB с представлением, значения которого являются парными числами вида [x, y].Для документов с одинаковым ключом мне нужно (одновременно) вычислить минимум x и максимум y.База данных, с которой я работаю, содержит около 50000 документов.Построение вида занимает несколько часов, что кажется несколько чрезмерным.(Сами ключи - это массивы длиной три). Ниже я показываю карту и сокращаю функции, но основной вопрос: как я могу ускорить этот процесс?

Обратите внимание, что встроенные функции не будут работать, поскольку значения должны быть числами, а не массивами длины два.Вполне возможно, что я мог бы сделать два разных вида (один для min (x) и один для max (y)), но мне неясно, как их объединить, чтобы получить оба результата одновременно.функция карты в основном выглядит как

function(doc) {
  emit ([doc.a, doc.b, doc.c], [doc.x, doc.y])
}

, а моя функция уменьшения выглядит как

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]);
}

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Еще две заметки. Использование Math.max () и Math.min () должно быть немного быстрее.

function(keys, values) {
  var x = -Infinity,
      y = Infinity;
  for (var i = 0, v; v = values[i]; i++) {
    x = Math.max(x, v[0]);
    y = Math.min(y, v[1]);
  }
  return [x, y];
}

И если CouchDB обрабатывает значения как строки, то это потому, что вы храните их как строки в документе.

Надеюсь, это поможет.

1 голос
/ 10 марта 2011

Оказалось, что это сочетание двух факторов. Это очевидно в приведенном выше коде, где используется «emit», когда следует использовать «return».

Другой фактор менее очевиден и был обнаружен только путем создания уменьшенной версии базы данных и регистрации шагов в функции Reduce. Хотя записи в «значениях» должны были быть целыми числами, они рассматривались CouchDB как строки символов. Использование функции parseInt исправило эту проблему.

После этих двух исправлений вся сборка уменьшенного представления заняла около пяти минут, поэтому проблема со скоростью испарилась.

0 голосов
/ 04 октября 2011

Пожалуйста, отметьте http://www.geeksforgeeks.org/archives/4583. Это может быть распространено на ваше приложение.

...