gpt4 book ai didi

javascript - 如何在 JavaScript 中解析大型 JSON 流中的项目?

转载 作者:行者123 更新时间:2023-12-03 06:56:52 25 4
gpt4 key购买 nike

所以我下载了 Wikidata JSON 转储,它大约 90GB,太大而无法加载到内存中。它由一个简单的 JSON 结构组成,如下所示:

[
item,
item,
item,
...
]
每个“项目”看起来像这样:
{
"type": "item",
"id": "Q23",
"labels": {
"<lang>": obj
},
"descriptions": {
"<lang>": {
"language": "<lang>",
"value": "<string>"
},
},
"aliases": {
"<key>": [
obj,
obj,
],
},
"claims": {
"<keyID>": [
{
"mainsnak": {
"snaktype": "value",
"property": "<keyID>",
"datavalue": {
"value": {
"entity-type": "<type>",
"numeric-id": <num>,
"id": "<id>"
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
},
"type": "statement",
"id": "<anotherId>",
"rank": "preferred",
"references": [
{
"hash": "<hash>",
"snaks": {
"<keyIDX>": [
{
"snaktype": "value",
"property": "P854",
"datavalue": obj,
"datatype": "url"
}
]
},
"snaks-order": [
"<propID>"
]
}
]
}
]
},
"sitelinks": {
"<lang>wiki": {
"site": "<lang>wiki",
"title": "<string>",
"badges": []
}
}
}
JSON 流的配置如下:
const fs   = require('fs')
const zlib = require('zlib')
const { parser } = require('stream-json')

let stream = fs.createReadStream('./wikidata/latest-all.json.gz')
stream
.pipe(zlib.createGunzip())
.pipe(parser())
.on('data', buildItem)

function buildItem(data) {
switch (data.name) {
case `startArray`:
break
case `startObject`:
break
case `startKey`:
break
case `stringChunk`:
break
case `endKey`:
break
case `keyValue`:
break
case `startString`:
break
case `endString`:
break
case `stringValue`:
break
case `endObject`:
break
case `endArray`:
break
}
}
注意 buildItem有关键信息,它表明 JSON 流发出这样的对象(这些是日志):
{ name: 'startArray' }
{ name: 'startObject' }
{ name: 'startKey' }
{ name: 'startString' }
{ name: 'stringValue', value: 'type' }
{ name: 'endString' }
...
您如何将其解析为 item像上面这样的对象?将这种线性流解析成树是非常难以理解的。
JSON 流的输出示例是 here ,如果有帮助,您可以使用它来测试解析器。

最佳答案

使用内置函数 (StreamArray)
stream-json 已经有将流转换为对象的内置函数(在这种情况下,您正在寻找 StreamArray )。您可能希望使用内置函数,因为它们的编码考虑了性能。
要使用它,它看起来像:

const fs   = require('fs')
const zlib = require('zlib')
const { parser } = require('stream-json')
const { streamArray } = require('stream-json/streamers/StreamArray')

let stream = fs.createReadStream('./wikidata/latest-all.json.gz')
stream
.pipe(zlib.createGunzip())
.pipe(parser())
.pipe(streamArray())
.on('data', d => processData(d.value))

function processData(data) {
console.log(data)
}

我建议查看 https://github.com/uhop/stream-json/wiki 上的 wiki有关更多信息,因为它具有附加功能,特别是用于过滤或转换,这可能对您有用,特别是如果速度是一个问题。

关于javascript - 如何在 JavaScript 中解析大型 JSON 流中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64580743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com