Использование 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))