【发布时间】:2021-10-26 05:26:58
【问题描述】:
我有一个json文件,该文件的结构如下:
{
"orders":[
{
"id": 876876876,
"app_id":580714,
"client_details": {},
"discount_codes": [{}],
"line_items": [
{
"id": 466157049,
...
}
],
......
},
{
"id": 47844583,
"app_id":580714,
"client_details": {},
"discount_codes": [{}],
"line_items": [
{
"id": 466157049,
...
}],
....
},
{...},
{...},
{...}
]
}
这个数组可以包含超过 100 万(100 万)个对象。目前我需要:
- 查找具有订单 ID 的对象
- 订单总数
- 获取带有订单id和数量限制的订单
我正在使用以下代码:
return new Promise((resolve, reject) => {
var orders = []
var getStream = function () {
var stream = fs.createReadStream(file_path, { encoding: 'utf8' }),
parser = JSONStream.parse('*');
return stream.pipe(parser);
};
getStream()
.pipe(es.mapSync(function (data) {
orders = data
})) .on('end', function() {
resolve(orders)
})
})
但这会使系统挂起。另外,我也使用了以下命令:
node --max-old-space-size=8192 index.js
但这也行不通。谁能帮我处理这么大的json文件。
已编辑: 现在文件大小为 850MB,我正在使用以下代码:
return new Promise((resolve, reject) => {
var data = ''
var reader_stream = fs.createReadStream(file_path)
reader_stream.setEncoding('UTF8')
reader_stream.on('data', function(chunk) {
data += chunk
})
reader_stream.on('end',function() {
try{
const orders_result = JSON.parse(data)
var order_count = (orders_result.orders)
resolve({
"count": order_count.length
})
} catch(err) {
console.log(err)
}
})
reader_stream.on('error', function(err) {
console.log(err.stack)
reject(err.stack)
})
})
并得到以下错误
未捕获的异常:RangeError:无效的字符串长度
【问题讨论】:
-
当您拥有如此大量的数据时,将其存储在数据库中可能是一个好主意。您可以从中查询您需要的内容。
-
我知道@Sandsten,但 DB 不是这里的选项。
-
什么是“不工作”?
-
@DeepKakkar - 10GB JSON 需要 >10GB 内存用于您的节点进程 - 我认为您的节点进程在 64 位操作系统中是 64 位的,对吧?
-
@DeepKakkar,我想你正在寻找这个question 并且可能在那里重复。
标签: javascript node.js arrays fs