【发布时间】:2019-09-06 13:33:38
【问题描述】:
当我编译我的 typescript 代码时,它与 vanilla javascript 代码完全相同,当代码运行直到崩溃时,我的内存使用量增加了。 vanilla javascript 代码的内存使用量始终保持不变。
代码连接到一个 mqtt 代理,然后读入一个文件并将文件中的每一行作为 mqtt 消息发布。
打字稿代码:
import { createReadStream } from 'fs'
import { split, mapSync } from 'event-stream'
import { connect } from 'mqtt'
const client = connect('mqtt://localhost:1883')
client.on('connect', () => {
let lineNr = 0
const stream = createReadStream('<PATH_TO_LARGE_FILE>')
.pipe(split())
.pipe(mapSync(async line => {
// pause the readstream
stream.pause()
lineNr++
if(lineNr % 1000 === 0)
console.log(`${lineNr}\t${process.memoryUsage().heapTotal / 1048576}`)
await new Promise((resolve, reject) => {
client.publish('/standardized', line.toString(), () => {
resolve()
})
})
stream.resume()
})
.on('error', function(err){
console.log('Error while reading file.', err)
stream.destroy()
})
.on('end', function(){
console.log('Read entire file')
stream.destroy()
})
)
})
原版 Javascript:
const { createReadStream } = require('fs')
const { split, mapSync } = require('event-stream')
const { connect } = require('mqtt')
const client = connect('mqtt://localhost:1883')
client.on('connect', () => {
let lineNr = 0
const stream = createReadStream('<PATH_TO_LARGE_FILE>')
.pipe(split())
.pipe(mapSync(async line => {
// pause the readstream
stream.pause()
lineNr++
if(lineNr % 1000 === 0)
console.log(`${lineNr}\t${process.memoryUsage().heapTotal / 1048576}`)
await new Promise((resolve, reject) => {
client.publish('/standardized', line.toString(), () => {
resolve()
})
})
stream.resume()
})
.on('error', function(err){
console.log('Error while reading file.', err)
stream.destroy()
})
.on('end', function(){
console.log('Read entire file')
stream.destroy()
})
)
})
预期:编译后的打字稿代码的内存使用量也应该保持不变 实际:编译后的打字稿代码的内存使用量会增加,直到代码崩溃
【问题讨论】:
-
您是否检查了生成的 JavaScript 代码(Typescript 转译器编写的代码)是否存在差异?
-
正如@Pointy 所说,将编译后的 TypeScript 与 vanilla JavaScript 进行比较。对于现代目标,编译后的 TypeScript 看起来几乎与您的 JavaScript 相同。所以我猜你正在使用一个不支持异步/等待的“旧”目标,这意味着 TypeScript 注入了一个使用更多内存的 polyfill。
-
如果您有机会使用
ts-node之类的东西或其他方式在运行时编译您的 ts,那么这可能是您的问题的原因。那么你首先要做的就是手动编译你的ts,直接使用生成的js,看看内存是否还在泄漏。
标签: javascript node.js typescript mqtt