在nodejs中写入文件之前对数据流进行排序

2024-03-16

我有一个输入文件,可能包含最多 1M 条记录,每条记录如下所示

field 1 field 2 field3 \n

我想读取这个输入文件并根据field3在将其写入另一个文件之前。

这是我到目前为止所拥有的

var fs = require('fs'),
    readline = require('readline'),
    stream = require('stream');

var start = Date.now();

var outstream = new stream;
outstream.readable = true;
outstream.writable = true;

var rl = readline.createInterface({
    input: fs.createReadStream('cross.txt'),
    output: outstream,
    terminal: false
});

rl.on('line', function(line) {
    //var tmp = line.split("\t").reverse().join('\t') + '\n';
    //fs.appendFileSync("op_rev.txt", tmp );
    // this logic to reverse and then sort is too slow
});

rl.on('close', function() {
    var closetime = Date.now();
    console.log('Read entirefile. ', (closetime - start)/1000, ' secs');
});

我基本上陷入了这一点,我所拥有的就是从一个文件读取并写入另一个文件的能力,有没有一种方法可以在写入之前有效地对这些数据进行排序


DB and sort-stream are fine solutions, but DB might be an overkill and I think sort-stream eventually just sorts the entire file in an in-memory array (on through end callback), so I think performance will be roughly the same, comparing to the original solution.
(but I haven't ran any benchmarks, so I might be wrong).

因此,为了解决这个问题,我将提出另一个解决方案:)


EDIT:我很好奇这会有多大的差异,所以我运行了一些基准测试。

事实证明,结果甚至让我感到惊讶sort -k3,3到目前为止,解决方案更好,速度快了 10 倍然后是原始解决方案(简单的数组排序),而nedb and sort-stream解决方案至少慢 x18 倍比原始解决方案慢(即至少慢 x180 倍)sort -k3,3).

(参见下面的基准测试结果)


如果在 *nix 机器(Unix、Linux、Mac...)上,您可以简单地使用
sort -k 3,3 yourInputFile > op_rev.txt并让操作系统为您进行排序。
您可能会获得更好的性能,因为排序是本机完成的。

或者,如果您想在 Node 中处理排序后的输出:

var util = require('util'),
    spawn = require('child_process').spawn,
    sort = spawn('sort', ['-k3,3', './test.tsv']);

sort.stdout.on('data', function (data) {
    // process data
    data.toString()
        .split('\n')
        .map(line => line.split("\t"))
        .forEach(record => console.info(`Record: ${record}`));
});

sort.on('exit', function (code) {
    if (code) {
        // handle error
    }

    console.log('Done');
});

// optional
sort.stderr.on('data', function (data) {
    // handle error...
    console.log('stderr: ' + data);
});

希望这可以帮助 :)


EDIT:添加一些基准细节。

我很好奇这会有多大的差异,所以我运行了一些基准测试。

以下是结果(在 MacBook Pro 上运行):

  • sort1 https://gist.github.com/yoava/fd291e13ef703a4ea68a33c463dc376a使用一种简单的方法,对记录进行排序in-memory array.
    平均时间:35.6s(基线)

  • sort2 https://gist.github.com/yoava/7d45c531cf727247c393d43d6033a938 uses sort-stream,正如乔·克里尔建议的那样。
    平均时间:11.1m (about 慢 18.7 倍)
    (我想知道为什么。我没有深入研究。)

  • sort3 https://gist.github.com/yoava/8a05ad916efb852cfd0f2b3482d7ec0c uses nedb,正如 Tamas Hegedus 所建议的那样。
    时间:约16m (about 慢 27 倍)

  • sort4 https://gist.github.com/yoava/78a6f880db73ee4686162caed88a459d仅通过执行来排序sort -k 3,3 input.txt > out4.txt在终端中
    平均时间:1.2s (about 快 30 倍)

  • sort5 https://gist.github.com/yoava/579fe6953a22ca724ed3afd95929f389 uses sort -k3,3,并处理发送到标准输出的响应
    平均时间:3.65s (about 速度提高 9.7 倍)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在nodejs中写入文件之前对数据流进行排序 的相关文章

  • 如何立即启动setInterval循环? [复制]

    这个问题在这里已经有答案了 在一个简单的setInterval setInterval function Do something every 9 seconds 9000 第一个动作将在 9 秒后发生 t 9s 如何强制循环立即执行第一个
  • 如何使 d3 饼图响应式?

    我有一个 PIE 图表 它工作正常 但我无法使其具有响应能力和可调整大小 我需要它与移动浏览器和 iPad 等兼容 div div
  • jQuery输入文件点击方法和IE上拒绝访问

    我尝试仅使用一个按钮作为输入文件 它在 Firefox Chrome Safari 中工作正常 但在 IE 中不行 提交表单时我总是收到 访问被拒绝 的消息 代码 input file click 有真正的解决方法吗 我在谷歌上浪费了大约2
  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • 如何获取nodejs程序中的nodejs版本?

    In a Node js 的调试器 https github com rocky trepanjs 有一个命令显示V8版本和调试器包版本 如何获取nodejs版本 我想我基本上可以运行命令node version or nodejs ver
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • 如何在画布上所有其他内容后面绘制图像? [复制]

    这个问题在这里已经有答案了 我有一块画布 我想用drawImage在画布上当前内容后面绘制图像 由于画布上已经有内容 我正在使用字面上的画布来创建包含图像的画布 因此我无法真正先绘制图像 所以我无法使用drawImage在我呈现其余内容之前
  • 摩纳哥:如何添加内联自动完成/代码建议?

    我找不到任何有关如何添加内联自动完成功能的示例 如下图所示 有人可以指导我如何在摩纳哥做到这一点吗 这可以在 v1 66 中启用 现在在 Insiders 中 The editor quickSuggestions设置现在接受内联为 配置值
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • PDF 在 Safari 中隐藏 Jquery Modal

    这是与我有关的事情this https stackoverflow com questions 24052681 pdf hide jquery modal in ie问题 在 IE 中 我在对话框中使用 iframe 解决了问题 所以它工
  • Jwt 签名和前端登录身份验证

    我有这个特殊的 jwt sign 函数 Backend const token jwt sign id user id process env TOKEN SECRET expiresIn 1m res header auth token
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • 如何在运行脚本之前提交活动单元格中所做的更改? (Google 表格/Google Apps 脚本)

    我正在使用 Google Apps 脚本在 Google 表格中创建提交表单 该表单位于一页上 提交内容被移至第二个隐藏页面 当用户填写表单后 他们按下提交页面上的按钮以激活脚本 我遇到的问题是 当用户填写最后一个单元格然后单击按钮时 输入

随机推荐

  • 如何将附加参数传递给 jQuery DataTable ajax 调用?

    加载 jQuery DataTable 时 我有如下所示的代码 如何向 AJAX 调用传递附加参数 下面的问题和答案中建议的 fnServerParams 回调不起作用 也就是说 天真地使用aodata push 结果是 push is u
  • 用c#在服务器上写入XML值

    我正在尝试将值更新为 xml 文件上的标记 我使用 xmlDoc Save URLString 在本地它可以工作 但是如果我从服务器读取文件 我会收到错误 URI 不可能 服务器上的文件和文件夹权限设置为 777 None
  • 如何正确启用/禁用Flutter的Button

    经研究 当 onPressed 为 null 时 Flutter 的 Button 会自动禁用 然而 由于我必要的测试功能 我被迫放置一个箭头函数 gt 它似乎不会触发 onPressed 实际上为 null 而是返回 null 作为值 因
  • ANR(强制关闭/等待),同时生成足够大的列表

    我正在创建一种文件资源管理器 其中如果将任何应用程序文件复制到手机 SD 卡 我将在带有对话框主题的活动中向用户显示它 对于复制的每个新 app apk 我都会将应用程序的名称和位置附加到对话框中 并且列表是可滚动的 我的问题是 如果我一次
  • 使用 Fast API 接收图像,使用 cv2 处理然后返回

    我正在尝试构建一个 API 它接收图像并对其进行一些基本处理 然后使用 Open CV 和 Fast API 返回它的更新副本 到目前为止 我的接收器工作得很好 但是当我尝试对处理后的图像进行 Base64 编码并将其发送回时 我的移动前端
  • 类型错误:无法深度复制此模式对象

    试图理解我的 变量 类中的这个错误 我希望在我的 Variable 类中存储 sre SRE Pattern 我刚刚开始复制 Variable 类 并注意到它导致我的所有 Variable 类实例发生更改 我现在明白我需要深度复制此类 但现
  • CAPL 编程使用 Timer 作为延迟

    我一直在编写一个 CAPL 脚本 它会在一定的延迟后在每个通道 2 个 上发送消息 我想使用生成以下延迟设置定时器 and mtimer 正在运行功能 我可以使用 setTimer 函数 但我不知道如何使用mtimer 正在运行 代码如下所
  • PhoneGap / Android 自定义键盘

    我正在开发一个具有多个input type numer 元素 目前仅限安卓 内置数字键盘有两个问题 it s inconsistent different on different versions of Android it has un
  • 如何向 ASP.NET 中的元素添加多个类?

    我正在尝试以编程方式将第二个类添加到 td C 中的元素 我想要添加类的元素已经分配了一个类 如果我做类似的事情 myObject CssClass MyClass 它只是覆盖原来的类 我想我可以做类似的事情 myObject CssCla
  • 关于*管理*测试驱动和/或敏捷开发的最佳具体“操作手册”? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一本易于理解的书来呈现给我的老板 团队 背景资料 我们越来越多的工作会议让我的老板 团队思考
  • R Shiny - 条件面板中的条件面板

    我想知道是否可以在另一个条件面板中包含一个条件面板 例如 如果我有一个包含两个选项的下拉列表 1 和 2 选择 1 将显示一组选项 选择 2 将显示另一组选项 但是是否可以在这些条件面板中嵌套一个条件面板 以便我可以在选项 1 的输入中拥有
  • Javascript - 在单词中拖动字母(重新排列)

    我目前正在开发一款名为 词洗牌 http wordshuffle bplaced net 目前单词是德语 用于测试目的 如果你想玩的话 我的进步进展顺利 但我决定改变你玩游戏的方式 目前 您必须通过在文本字段中输入您的猜测来猜测该单词 所以
  • 错误:无法连接到系统 d-bus:未安装 d-bus

    我现在使用 Virtual Box 启动 VM 版本是 5 1 26 r117224 Qt5 6 2 但是当我尝试启动 VM 时 我看到以下错误消息 00 00 29 246866 VMMDev Guest Log 00 00 00 000
  • 实体框架和分片数据库

    我有一个 WCF 数据服务在实体框架代码优先 4 1 提供程序之上运行 该数据库相当大 一个关键表有 77 百万条记录 并且每月增长约 10 并且出现了相当大的性能问题 虽然对这么大的数据库进行分片是一件痛苦的事情 但这似乎是不可避免的 我
  • 用于多行注释的 Unix Flex 正则表达式

    我正在 Unix 上使用 Flex 制作词法分析器 如果您之前使用过它 您就会知道您主要只是为您为其编写词法分析器的任何语言的标记定义正则表达式 我被困在最后一部分 我需要正确的正则表达式来进行多行注释 以允许类似的事情 This is a
  • MATLAB:两个矩阵在一个索引上的逐元素乘法?

    我试图弄清楚是否有一种本地方法可以在 Matlab 中获得两个矩阵的某种元素乘积 我正在寻找的产品需要两个矩阵 A and B说 并返回那里的产品C 其元素由下式给出 C i j k A i j B j k 自然地 列数A假设与行数相同B
  • 为什么 ui.alert 可以工作,但 ui.prompt 不能与 onOpen() 一起使用?

    当我使用 onOpen 时 我可以创建一个弹出窗口 ui alert 但 ui prompt 不起作用 例如 function onOpen var ui SpreadsheetApp getUi get ui for alert ui a
  • 我是否有 gcc 优化错误或 C 代码问题?

    测试以下代码 include
  • 我可以通过编程方式创建 Google 帐户吗?

    有谁知道是否通过java中的google api 我可以以编程方式创建谷歌帐户 Yes ish 管理 SDK https developers google com admin sdk Directory API 允许您创建可与 Googl
  • 在nodejs中写入文件之前对数据流进行排序

    我有一个输入文件 可能包含最多 1M 条记录 每条记录如下所示 field 1 field 2 field3 n 我想读取这个输入文件并根据field3在将其写入另一个文件之前 这是我到目前为止所拥有的 var fs require fs