我有一个对象数组。我需要将它转换为.jsonl格式,并在使用lambda函数的节点中作为响应发送。我一直试图将它更改为字符串并添加'\n'使其成为新行,但没有成功。
我有一个对象数组。我需要将它转换为.jsonl格式,并在使用lambda函数的节点中作为响应发送。我一直试图将它更改为字符串并添加'\n'使其成为新行,但没有成功。
生成jsonlines的简单代码。 jsonlines实际上只是一堆单行JSON对象串联在一起并用换行符连接起来的字符串化对象。 就是这样。
你需要处理的另一个问题是转义Unicode,所以当你写入文件时,必须使用UTF-8编码。
使用jsonlines npm库的repl.it演示:https://repl.it/repls/AngelicGratefulMoto
Simple plain JS demo:
data = [{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' }]
console.log(
data.map(x=>JSON.stringify(x)).join('\n')
)
对象数组
数据量达到约 100 MB
时仍有效,而超过该范围则会失败(我的解决方案可以在 node.js v14.1.0
下使用 DockerOperator
在 airflow v2.0.1
中运行,可处理大小约为 100 MB
的对象数组
,但对于大小在 750 MB
左右的对象数组
,它将失败,出现以下问题:JSON.stringify throws RangeError: Invalid string length for huge objects)。
试图实现与https://dev.to/madhunimmo/json-stringify-rangeerror-invalid-string-length-3977类似的解决方案,将.json
转换为.jsonl
,但遇到与上述相同的问题 - JSON.stringify throws RangeError: Invalid string length for huge objects。
实施@Bergi
的答案中的for...of
- Using async/await with a forEach loop对我来说效果很好,具有出色的性能(我的实现可以在 node.js v14.1.0
下使用DockerOperator
在airflow v2.0.1
中运行,可处理大小约为750 MB
的对象数组
)。
const fsPromises = require('fs').promises;
const writeToFile = async () => {
const dataArray = [{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' },{ jsonlines: 'is awesome' }];
for (const dataObject of dataArray) {
await fsPromises.appendFile( "out.jsonl" , JSON.stringify(dataObject) + "\n");
}
}
附言:如果您尚未为node.js v14.1.0
提供默认值以上的额外内存,则在处理较大数据(通常>100 MB
)时,您将面临Node JS Process out of memory问题。以下是在Dockerfile
中使用的解决方法(将6144
替换为您想要分配的内存量MB
)
CMD node --max-old-space-size=6144 app.js