Использование setImmediate для улучшения производительности JSON.stringify для больших объемов данных

У меня есть код, который JSON.stringify представляет собой массив таких объектов:

      const postsCommentsReadyForDB = postsComments.map(postComments => ({
  id: getPostId(postComments),
  comments: JSON.stringify(getComments(postComments)),
}))

Однако для очень больших объемов данных (например, массива из 6000+ объектов) это может занять до 3+ секунд из-за всей обработки JSON.stringify.

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

Вот мой подход к этому с помощью setImmediate:

      const postsCommentsReadyForDB = []

postsComments.forEach(postComments => {
  setImmediate(_ => {
    postsCommentsReadyForDB.push({
      id: getPostId(postComments),
      comments: JSON.stringify(getComments(postComments)),
    })
  })
})

Однако, когда я запускаю это, похоже, что это не работает, а postsCommentsReadyForDB пуст.

Можно ли использовать setImmediate в этом сценарии?

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

      const util = require('util')
const setImmediatePromise = util.promisify(setImmediate)

async function* asyncGenerator(postsComments) {

  while (postsComments.length) {

    const postComments = postsComments.shift()

    yield setImmediatePromise().then(_ => ({
      id: getPostId(postComments),
      comments: JSON.stringify(getComments(postComments)),
    }))
  }
}

async function foo(){

  const postsCommentsReadyForDB = []

  for await (const postComments of asyncGenerator(postsComments)) {
    postsCommentsReadyForDB.push(postComments)
  }

}

foo().catch(err => console.error(err))

1 ответ

Судя по предложению Берги, этот подход работает:

      const util = require('util')
const setImmediatePromise = util.promisify(setImmediate)


async function foo(){

  const postsCommentsReadyForDB = []

  for (const postComments of postsComments) {

    await setImmediatePromise()

    postsCommentsReadyForDB.push({
      id: getPostId(postComments),
      comments: JSON.stringify(getComments(postComments)),
    })
  }

}

foo().catch(err => console.error(err))
Другие вопросы по тегам