使用 node.js 将非常大的 json 文件索引/摄取到数据库
Posted
技术标签:
【中文标题】使用 node.js 将非常大的 json 文件索引/摄取到数据库【英文标题】:index/ingest very large json file to database with node.js 【发布时间】:2016-07-30 14:26:52 【问题描述】:我继承了一个巨大的 json 文件,我试图将它索引到 elasticsearch 中(不是真正的数据库,但不要挂在 es 上,它应该适用于大多数 db 摄取)。我正在使用节点进行摄取。我已经尝试过流和异步,但我很难过我没有解决这个问题的框架 - 没有内存溢出等。
我无法发布 1 对 1,但它实际上是一个看起来像这样的多维对象:
[
document:
type: 1,
type2: 2,
type3: ...
,
...
]
我只需要摄取文档,我可以使用 elasticsearch 客户端批量处理它们。我需要减慢流、解析和分块的速度。
完全卡住了......帮助***这是星期五我想回家; )。
【问题讨论】:
你试过npmjs.com/package/json-parse-stream吗? 这可能是json流解析的一个版本我没试过,我现在试试这个。 好的,在这个模块上取得了一些进展,这个模块可能是解决方案。 【参考方案1】:基于 migg 对 json-parse-stream 的建议——我尝试的第三个 json 流库——我终于有了一个工作摄取。事实上,它在我写这篇文章时正在运行。希望有人会觉得这很有用。
const fs = require('graceful-fs');
const parse = require('json-parse-stream');
const es = require('event-stream');
const client = new require('elasticsearch').Client();
var WritableBulk = require('elasticsearch-streams').WritableBulk;
var TransformToBulk = require('elasticsearch-streams').TransformToBulk;
var rs = fs.createReadStream('./resources/mydoc.json');
var bulkExec = function (body, callback)
console.log(body);
client.bulk(
index: 'my_index',
type: 'my_type',
body: body
, callback);
;
var toBulk = new TransformToBulk(() => return _index: 'my_index', _type: 'my_type' ; );
const done = (err, res) =>
if (err)
console.log(err);
console.log(res);
console.log('go get a drink you deserve it');
;
var ws = new WritableBulk(bulkExec);
rs.pipe(parse())
.pipe(es.mapSync(function (element)
var a = [];
if (element.key === 'document')
a = element.value;
return a;
))
.pipe(toBulk)
.pipe(ws).on('finish', done);
【讨论】:
很高兴你把你的答案放在这里。以上是关于使用 node.js 将非常大的 json 文件索引/摄取到数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何通过node.js中的JSONStream模块解析一个大的、换行符分隔的JSON文件?