Быстрое разбиение массива в Node.js

1

Я работаю с массивом в больших наборах данных. Мне нужно создать новый массив кусков определенного размера. В настоящее время я использую это решение, но оно показывает плохую производительность.

function array_to_chunks(data, size){
   let chunks = []
   let d = data.slice()
   while (d.length >= size) chunks.push(d.splice(0, size))
   return chunks
}

Я хотел бы найти лучшее представление о том, как сделать это достаточно быстро и почему мой код не работает хорошо.

  • 2
    Вы используете ввод-вывод с этим? Если это так, используйте потоки Node.js. В противном случае вы буферизуете все.
  • 0
    Нет не знаю На самом деле это невозможно из-за текущего состояния проекта.
Показать ещё 2 комментария
Теги:
arrays
chunks
array-splice

3 ответа

2
Лучший ответ

Это немного более результативно, потому что вам не нужно копировать массив:

const createGroupedArray = function (arr, chunkSize) {

    if (!Number.isInteger(chunkSize)) {
        throw 'Chunk size must be an integer.';
    }

    if (chunkSize < 1) {
        throw 'Chunk size must be greater than 0.';
    }

    const groups = [];
    let i = 0;
    while (i < arr.length) {
        groups.push(arr.slice(i, i += chunkSize));
    }
    return groups;
};

если вы выполняете ввод-вывод, то используйте Node.js-потоки:

const strm = new Writable({
  write(chunk, enc, cb){
     // do whatever
  }
});
  • 1
    slightly more performant - по моим подсчетам это до 400 раз быстрее! в зависимости от размера исходного массива и размера фрагмента (в 700 раз быстрее)
  • 1
    К сожалению, я должен скопировать его, поскольку к «данным» обращаются другие методы объекта (при условии, что код является адаптацией)
Показать ещё 8 комментариев
0

Мне интересно услышать ваше мнение по этому подходу:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
const size = 5

const chunkIt = (arr, size) => {
  let buckets = []

  // Just create the buckets/chunks storage
  for (let i = 1; i <= Math.ceil(arr.length / size); i++) {
    buckets.push([])
  }

  // Put in the buckets/storage by index access only
  for (let i = 0; i < arr.length; i++) {
    var arrIndex = Math.ceil((i + 1) / size) - 1
    buckets[arrIndex].push(arr[i])
  }

  return buckets;
}

console.log(chunkIt(arr, size))

Я сделал базовый бенчмаркинг JS, и все было хорошо. Идея состоит в том, чтобы предварительно создать ведра, поскольку эта операция не должна быть такой дорогостоящей, а затем просто нажимать на индекс.

0

вы можете использовать метод lodash chunk, это делает то, что вам нужно

const _ = require('lodash');
_.chunk([1,2,3,4,5,6],2);
  • 0
    это более производительный? это важный вопрос
  • 0
    Нет, это не делает трюк :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню