Виноват ли setInterval?
Может быть проблема с памятью, связанная с тем, как используется setInterval
, но обычно это связано с обратным вызовом setInterval
с использованием замыкания, сохраняющего ссылку на определенные объекты. При этом сборщик мусора G C в движках javascript улучшился настолько, что он может обнаруживать эти недостижимые коды и удалять большинство из них. setInterval
явно не является причиной проблемы. for
или while
l oop могли бы вызвать проблему.
Почему заполнена память?
Основная причина в том, что слишком много создаются тензоры.
const tfimage = tfnode.node.decodeJpeg(imageBuffer)
Тензоры неизменяемы. Каждый раз, когда появляется новое назначение, создается новый тензор. Следовательно, объем памяти увеличивается с увеличением числа тензоров. По-другому все работает со встроенными объектами js. Однако следующий код требует некоторой памяти - для создания массива - не вызовет утечки памяти. Поскольку G C знает, что для каждой итерации while
l oop предыдущая переменная v
больше не будет использоваться и, следовательно, будет собираться мусор.
while(true) {
const v = Array.from({length: 1000000}, k => k+1)
}
Как сделать решить проблему
Каждый созданный тензор должен быть явно помещен в конец блока while. tf.dispose
поможет избавиться от одного тензора.
setInterval(() => {
const imageBuffer = fs.readFileSync(path.join(__dirname, 'temp.png'))
const tfimage = tfnode.node.decodeJpeg(imageBuffer)
tfnode.dispose(tfimage)
console.log(`${++counter} - ${process.memoryUsage().rss / 1024 / 1024} MB`)
}, 100)
В случае, если нужно избавиться от многих тензоров, их можно использовать в блоке tf.tidy
setInterval(() => {
tfnode.tidy(() => {
const imageBuffer = fs.readFileSync(path.join(__dirname, 'temp.png'))
const tfimage = tfnode.node.decodeJpeg(imageBuffer)
console.log(`${++counter} - ${process.memoryUsage().rss / 1024 / 1024} MB`)
})
}, 100)