我需要在Javascript/Node中对大型(5-10GB)日志(log)文件进行一些解析.js(我正在使用Cube).

日志(log)线看起来像:

10:00:43.343423 I'm a friendly log message. There are 5 cats, and 7 dogs. We are in state "SUCCESS".

我们需要读取每一行,进行一些解析(例如,go 掉57SUCCESS),然后使用JS客户端将这些数据泵入多维数据集(https://github.com/square/cube).

首先, node 中逐行读取文件的规范方式是什么?

在网上,这似乎是一个相当常见的问题:

很多答案似乎都指向一堆第三方模块:

然而,这似乎是一项相当基本的任务——当然,在stdlib中有一种简单的方法可以逐行读取文本文件?

其次,我需要处理每一行(例如,将时间戳转换为日期对象,并提取有用的字段).

实现这一点的最佳方法是什么,最大限度地提高吞吐量?有没有一种方法不会阻碍每一行的读取,或者将其发送到多维数据集?

第三,我猜是使用字符串拆分,以及JS等价的contains(IndexOf!=-1?)会比正则表达式快很多吗?任何人都有在Node中解析大量文本数据的经验.js?

干杯

推荐答案

我搜索了一个解决方案,使用流逐行解析超大文件(gbs).所有第三方库和示例都不适合我的需要,因为它们不是逐行处理文件(比如1、2、3、4..)或者将整个文件读取到内存中

下面的解决方案可以使用stream&;管为了进行测试,我使用了一个2.1GB的文件,其中有17.000.000条记录.内存使用量不超过60 mb.

首先,安装event-stream软件包:

npm install event-stream

然后:

var fs = require('fs')
    , es = require('event-stream');

var lineNr = 0;

var s = fs.createReadStream('very-large-file.csv')
    .pipe(es.split())
    .pipe(es.mapSync(function(line){

        // pause the readstream
        s.pause();

        lineNr += 1;

        // process line here and call s.resume() when rdy
        // function below was for logging memory usage
        logMemoryUsage(lineNr);

        // resume the readstream, possibly from a callback
        s.resume();
    })
    .on('error', function(err){
        console.log('Error while reading file.', err);
    })
    .on('end', function(){
        console.log('Read entire file.')
    })
);

在此处输入图像描述

请告诉我进展如何!

Node.js相关问答推荐

为什么请求正文未定义?

如何更改node-soap时间戳持续时间和前置码?

MongoDB:更新批量操作中许多不能正常工作的内容

请求正文未定义

Next.js 路由不起作用 - 页面未正确加载

Postgressql的BIGSERIAL自增序列,即使由于唯一约束错误没有创建行,也会自动增加

Node.js中使用ffmpeg如何获取视频截图的位置?

eSignature API 的 NodeJS SDK 是否支持数据流?

我如何在 Raku 的供应中注册不同的事件?

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

当我们有esnext时,为什么我们需要nodenext typescript 编译器选项?

在 Express-js 中使用路由

Node.js mongodb 驱动程序异步/等待查询

在 PassportJS 中使用多种本地策略

如何undo撤消 Object.defineProperty 调用?

如何使用 Mocha 测试正常(非 node 特定)JavaScript 函数?

判断一个数组中的每个元素是否都在第二个数组中

如何在 Joi 字符串验证中使用枚举值

为什么我会收到错误:解决方法指定过多?

如何使用 cookie 创建 HTTP 客户端请求?