无法使用 Node.js 将大块数据填充到 mongodb

2023-11-30

我被要求导入从全市许多站点收集的大量天气数据。每个站点有 1 台计算机,每个计算机有一个文件夹,每 5 分钟同步到一台中央服务器。每天都会创建一个新文件。所以,基本上结构是这样的。 一个txt文件的格式为csv文件,其中第一行为字段,其余为数字。

服务器上的文件夹
|__ site1 __ date1.txt
| |__ 日期2.txt
|
|__ site2 __ date1.txt
|__ 日期2.txt
我编写了一个小型 Node.js 应用程序来将这些数据填充到 mongoDB 中。然而,目前我们只有3个站点,但每个站点有近900个txt文件,每个文件包含24*20 = 288行(每5分钟记录一次数据)。我尝试运行节点应用程序,但在读取第一个文件夹的大约 100 个文件后,程序崩溃并出现有关内存分配失败的错误。

我尝试了很多方法来改善这一点:

  1. 将 Node js 的内存大小增加到 8GB => 好一点,读入更多文件,但仍然无法移动到下一个文件夹。
  2. 在 _.forEach 循环末尾将某些变量设置为 null 且未定义(我使用下划线)=> 没有帮助。
  3. 移动文件数组(使用 fs.readdir),以便删除第一个元素=>也没有帮助。

有没有办法强制js每次读完文件后清理内存? 谢谢

更新 1:我最终一次在每个文件夹中添加 100 个文件。这看起来很乏味,但很有效,而且这就像一次性工作。但是,我仍然想找到解决这个问题的方法。


正如罗比所说,流是解决这个问题的方法。fs.createReadStream()应该使用而不是.readFileSync()。我首先创建一个行读取器,它采用路径以及您想要分割的任何字符串/正则表达式:

linereader.js

var fs = require("fs");
var util = require("util");
var EventEmitter = require("events").EventEmitter;

function LineReader(path, splitOn) {

    var readStream = fs.createReadStream(path);
    var self = this;
    var lineNum = 0;
    var buff = ""
    var chunk;

    readStream.on("readable", function() {

        while( (chunk = readStream.read(100)) !== null) {
            buff += chunk.toString();
            var lines = buff.split(splitOn);

            for (var i = 0; i < lines.length - 1; i++) {
                self.emit("line",lines[i]);
                lineNum += 1;
            }
            buff = lines[lines.length - 1];
        }
    });
    readStream.on("close", function() {
        self.emit("line", buff);
        self.emit("close")
    });
    readStream.on("error", function(err) {
        self.emit("error", err);
    })
}
util.inherits(LineReader, EventEmitter);
module.exports = LineReader;

这将读取一个文本文件,并为读取的每一行发出“行”事件,因此您不会同时将所有事件都存储在内存中。然后,使用 async 包(或您想要使用的任何异步循环),循环插入每个文档的文件:

app.js

var LineReader = require("./linereader.js");
var async = require("async");

var paths = ["./text1.txt", "./text2.txt", "./path1/text3.txt"];
var reader;

async.eachSeries(paths, function(path, callback) {

    reader = new LineReader(path, /\n/g);

    reader.on("line", function(line) {
        var doc = turnTextIntoObject(line);
        db.collection("mycollection").insert(doc);
    })
    reader.on("close", callback);
    reader.on("error", callback);
}, function(err) {
    // handle error and finish;
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Node.js 将大块数据填充到 mongodb 的相关文章

随机推荐

  • 当使用非虚拟析构函数“删除”基类时,Clang 和 GCC 会做什么?

    已经有一个问题询问 现实世界 的行为delete指向缺少虚拟析构函数的基类的指针 但问题仅限于非常有限的情况 派生类没有具有非平凡析构函数的成员 并且接受的答案只是说没有办法知道不检查每个编译器的行为 但这实际上并不是很有帮助 知道每个编译
  • authorize.net json返回额外字符

    我有这个代码 ch curl init curl setopt ch CURLOPT URL url curl setopt ch CURLOPT RETURNTRANSFER 1 curl setopt ch CURLOPT HTTPHE
  • Laravel 5 如何在保存时验证每个活动下的唯一客户名称

    我有三个模型 活动模型 客户模型和客户项目模型 如何在商店功能中进行验证检查 使每个活动中的客户名称应该是唯一的 以下是每个迁移文件 活动模型 public function up Schema create activities func
  • Angular Material 6 中用于自动完成的无限滚动

    我正在尝试在 Angular Material 6 中实现自动完成的无限滚动 我的场景很简单 我有一个启用了自动完成功能的输入字段 当用户键入时 我将使用输入字段中的文本进行 HTTP 调用 以将结果显示为建议 但我只想显示 25 条建议
  • 禁用优化后,演示代码未能显示出 4 倍快的 SIMD 速度

    我试图了解使用 SIMD 矢量化的好处 并编写了一个简单的演示代码 以了解利用矢量化 SIMD 的算法相对于其他算法的速度增益 这是2种算法 Alg A 无矢量支持 include
  • 让 Java 通过 HTTPS 接受所有证书

    我正在尝试让 Java 接受所有通过 HTTPS 的证书 这是出于测试目的 在我收到证书未找到错误之前 但是 在我的代码之前添加以下代码后 我得到了HTTPS hostname wrong should be
  • X.509 数字签名/加密工作流程/库建议?

    我的具体用例是 我必须访问存储在客户端上的数字证书 并使用它们在客户端和服务器端执行签名 验证 加密和解密的任务 对于后一部分 解决方案有很多很多 症结在于访问客户端上存储的证书的能力 请注意 我说的是 存储在客户端上的证书 这是故意含糊其
  • 如何在每个组内创建滞后变量?

    我有一个数据表 require data table set seed 1 data lt data table time c 1 3 1 4 groups c rep c b a c 3 4 value rnorm 7 data grou
  • 如何显示 html 元素,例如通过 Html.ValidationSummary() 渲染的错误中的链接

    我的一条错误消息呈现了一个链接 然而 Html ValidationSummary 对它进行编码 因此显示如下 您指定的手机或电子邮件帐户已存在 如果您忘记了密码 请重置它 相反 它应该呈现为 您指定的手机或电子邮件帐户已存在 如果您忘记了
  • 具有多个提交按钮或多个表单的表单[重复]

    这个问题在这里已经有答案了 我有一个文章列表 我为所有文章添加了提交按钮 事实是 当我在控制器中时 我无法隐藏良好的输入 因为它将采用最后的输入
  • 为什么SqlDataReader类不能被继承?

    SqlDataReader类没有标记为 seal 那么是什么使它不可继承呢 The SqlDataReader类型的构造函数被标记为internal这意味着它只能通过类型中的实例化System Data dll集会 这也禁止您继承它 因为基
  • 如何动态更改 GLTF 模型的纹理?

    在我的场景中 我加载了一个 gltf 模型 它渲染得很好 它有一个 png 纹理 渲染在 3D 模型的表面上 是否可以通过编程方式交换纹理 我正在使用 aframe a asset item 和 a entity 来加载 gltf 资产 O
  • iPhone 崩溃并显示“无回溯”

    我的 iPhone 应用程序最近被 App Store 拒绝 因为它在启动时崩溃 但是 我无法重现此崩溃 该应用程序在模拟器和具有 Apple 测试过的相同硬件和软件的设备 运行 iOS 4 的 iPhone 3 1 上都能完美运行 他们发
  • 如何在VB.net中运行应用程序时打印行号

    我想在 VB net 应用程序中打印出带有行号的调试消息 我就是这样做的 Dim st As StackTrace Dim sf As StackFramee st New StackTrace New StackFrame True sf
  • GTK 窗口捕获:VPython (OpenGL) 应用程序

    阅读了文档后VPython and GTK 线程 在我看来 可以在 gtk GUI 中嵌入 VPython 图形 我知道这是可能的Windows 上的 wx但我在 Linux 上使用 PyGTK 现在 我已经成功地取得了部分进展 我可以嵌入
  • 在node.js 中为所有传入的http 请求提供index.html

    我有一个像这样的节点服务器 var express require express var fs require fs var path require path var root fs realpathSync var app expre
  • 无法使用 Android BluetoothProfile 连接到蓝牙 Health Device Fora

    我想通过 Android BluetoothPROfile 连接到 Fora 温度计并获取读数 以下是我的方法 在 OnCreate 中我写了这段代码 if mBluetoothAdapter getProfileProxy this mB
  • 使用 Json.net 序列化时如何根据类型更改属性名称?

    我有一个类型的属性object我必须根据它的类型更改名称 应该非常类似于 XmlElement PropertyName typeof PropertyType XML 的属性 例如 我有一个房产public object Item get
  • 延迟加载变量错误

    我正在编写一个涉及核心数据的程序 我为我创建了一个类变量context and entity并将我的代码写成这样 class PersistencyManager var context NSManagedObjectContext let
  • 无法使用 Node.js 将大块数据填充到 mongodb

    我被要求导入从全市许多站点收集的大量天气数据 每个站点有 1 台计算机 每个计算机有一个文件夹 每 5 分钟同步到一台中央服务器 每天都会创建一个新文件 所以 基本上结构是这样的 一个txt文件的格式为csv文件 其中第一行为字段 其余为数