Вы можете сохранить следующее ожидаемое значение в замыкании и уменьшить массив.
function getRanges(array) {
return array.reduce((l => (r, v, i, a) => {
if (l[1] > v) return r;
r.push(l[1] === v
? (r.pop(), l.join('-'))
: (l = [v, v]).slice(0, 1).toString()
);
l[1]++;
return r;
})([]), []);
}
console.log(getRanges([-3, -2, -1, 2]));
console.log(getRanges([1, 2, 3, 4, 7, 8, 12, 15, 21, 21, 22, 23]));
Одно из решений, которое мы используем в последнее время, заключается в разделении огромных процессов базы данных на отдельные параллельные операции. Каждая операция намного меньше и разработана так, чтобы быть как можно более эффективной. Клиенты инициируют операции, порождают несколько потоков и делают все, что могут, параллельно.
Например, мы разбили несколько огромных процессов на ряд шагов, таких как "Начать", "Обработать 1 часть работы", "Завершить" и "Собрать данные отчета". Шаги Process Work могут выполняться параллельно, но они не могут начаться, пока не завершится шаг Start. Шаг Finish должен дождаться завершения всех шагов Process Work.
Поскольку клиент управляет процессом, он может сообщать о ходе выполнения именно того шага, на котором он находится.
Я встретился с подобными проблемами в прошлом и использовал один из следующих 3 методов для разрешения его:
Так или иначе я надеюсь, что один из тех имеет некоторую справку к Вам.
Веб-сервис мог выполнить запросы в пуле потоков и если поток не заканчивается в, говорит 5 секунд (см. Поток. Соединение ()), вызов веб-сервиса возвращает клиент JobID вместо набора результатов, который клиент может затем использовать для опроса сервера каждые несколько секунд, чтобы видеть если его законченный запрос. Когда поток заканчивается, результаты могут быть сохранены в хеш-таблице до клиентских опросов снова.