使用 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文件?

Json 到 node.js 中的 csv

将一个大的 json 文件拆分为多个较小的文件

node.js:将文本文件读入数组。 (每一行都是数组中的一个项目。)

node.js---package.json文件

使用 Node.js 将 json 文件写入 Firebase?