如何提高 MongoDB 批量性能?

2023-12-02

我有这个对象,其中包含一些元数据和大量项目。我曾经将其存储在 mongo 中,并通过以下方式查询它$unwind荷兰国际集团的数组。 然而,在极端情况下,阵列变得如此之大,以至于我遇到了 16MB BSON 限制。

所以我需要将数组的每个元素存储为单独的文档。为此,我需要将元数据添加到所有这些内容中,以便我可以找到它们。建议我使用批量操作为了这。

然而,性能似乎真的很慢。插入一份大文档几乎是即时的,这需要花费十秒.

var bulk        = col.initializeOrderedBulkOp();
var metaData    = {
    hash            : hash,
    date            : timestamp,
    name            : name
};

// measure time here

for (var i = 0, l = array.length; i < l; i++) { // 6000 items
    var item = array[i];

    bulk.insert({ // Apparently, this 6000 times takes 2.9 seconds
        data        : item,
        metaData    : metaData
    });

}

bulk.execute(bulkOpts, function(err, result) { // and this takes 6.5 seconds
    // measure time here
});

批量插入 6000 个文档,总计 38 MB 的数据(在 MongoDB 中转换为 BSON 为 49 MB),性能似乎糟糕得令人无法接受。 将元数据附加到每个文档的开销不会那么糟糕,对吧?更新两个索引的开销不会那么糟糕,对吧?

我错过了什么吗?有没有更好的方法来插入需要作为一个组来获取的文档组?

这不仅仅是我的笔记本电脑。在服务器上也一样。让我觉得这不是配置错误,而是编程错误。

使用 MongoDB2.6.11带节点适配器node-mongodb-native 2.0.49

-update-

只需将元数据添加到批量中的每个元素即可2.9秒。需要有更好的方法来做到这一点。


批量发送批量插入操作,因为这会减少服务器的流量,从而通过不在单独的语句中发送所有内容来执行高效的有线事务,而是将其分解为可管理的块以供服务器提交。使用这种方法,等待回调响应的时间也更少。

更好的方法是使用async模块,因此即使循环输入列表也是一个非阻塞操作。选择的批量大小可能会有所不同,但选择每 1000 个条目的批量插入操作将可以安全地保持在 16MB BSON 硬限制以下,因为整个“请求”等于一个 BSON 文档。

下面演示使用async模块的 while 迭代数组并重复调用迭代器函数,而 test 返回 true。停止时或发生错误时调用回调。

var bulk = col.initializeOrderedBulkOp(),
    counter = 0,
    len = array.length,
    buildModel = function(index){   
        return {
            "data": array[index],
            "metaData": {
                "hash": hash,
                "date": timestamp,
                "name": name
            }
        }
    };

async.whilst(
    // Iterator condition
    function() { return counter < len },

    // Do this in the iterator
    function (callback) {
        counter++;
        var model = buildModel(counter);
        bulk.insert(model);

        if (counter % 1000 == 0) {
            bulk.execute(function(err, result) {
                bulk = col.initializeOrderedBulkOp();
                callback(err);
            });
        } else {
            callback();
        }
    },

    // When all is done
    function(err) {
        if (counter % 1000 != 0) {
            bulk.execute(function(err, result) {
                console.log("More inserts.");
            }); 
        }           
        console.log("All done now!");
    }
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提高 MongoDB 批量性能? 的相关文章

  • ExpressJS & Websocket & 会话共享

    我正在尝试制作一个基于 Node js 的聊天应用程序 我想强制 websocket 服务器 ws 库 使用 ExpressJS 会话系统 不幸的是 我被困住了 用于获取会话数据的 MemoryStore 哈希值与 cookie 中的会话
  • Python:在任意维度中使用冒号运算符对数组进行索引

    我有一个 numpy nd 数组 我的任务的简化版本是沿着每个轴获取一个向量 为了显示 import numpy x numpy array range 24 reshape 2 3 4 x0 x 0 0 x1 x 0 0 x2 x 0 0
  • Nodejs 在路由器页面中包含 socket.io

    我有一个 Express Node 应用程序 并且我试图通过不在 app js 中包含所有 socket io 内容来保持代码整洁 我不知道解决这个问题的最佳方法 这是我最初的想法 感觉不是最干净的 app js var express r
  • 如何在 Next.js 中正确使用 Mongoose 模型?

    我正在使用 TypeScript 和 MongoDB Mongoose 构建 Next js 应用程序 我在使用 Mongoose 模型时开始遇到错误 这导致它们在每次使用模型时都尝试覆盖模型 导致模型覆盖错误的代码 import mong
  • Cython:为什么 size_t 比 int 快?

    更改某些 Cython 变量的类型int输入size t可以显着减少某些功能的时间 30 但我不明白为什么 例如 cimport numpy as cnp import numpy as np def sum int cnp int64 t
  • 设置环境变量供节点检索

    我正在尝试遵循教程 它说 有几种加载凭据的方法 从环境变量加载 从磁盘上的 JSON 文件加载 键需要如下所示 USER ID USER KEY 这意味着如果您正确设置环境变量 您 根本不需要管理应用程序中的凭据 根据一些谷歌搜索 我似乎需
  • 合并两个 gm 对象,同时在 GraphicsMagick for NodeJS 中调整其中一个对象的大小

    var image gm someImageUrl resize 100 100 var drawings gm 200 200 red fill blue drawRectangle 20 20 40 40 Would be great
  • 由于类型错误无法创建索引:格式字符串参数不足

    我正在尝试使用 pymongo 创建索引 但因错误而失败 File D Users Dims Design EnergentGroup Python GIS Developer worker Approach03 sentinel mong
  • 何时对 MongoDB 集合调用 EnsureIndex?

    我什么时候应该打电话ensureIndex 插入单条记录之前 插入单条记录之后 或者调用之前find 看来我的评论有点被误解了 所以我会澄清一下 当你调用它时并不重要只要在第一次调用 find 之前的某个时刻调用它即可 换句话说 什么时候创
  • 将 C++ 数组传递给 Ada95

    我正在尝试将无符号整数数组从 C 传递到 Ada Ada Lovelace 教程指出 Ada 数组对应于 C 中指向数组第一个元素的指针 这就是我正在尝试做的事情 C unsigned int buffer bufferSize unsig
  • CORS 问题。 Flask <-> AngularJS

    使用 angularjs 客户端应用程序和提供 api 的 Flask 应用程序启动一个新项目 我使用 mongodb 作为数据库 我必须立即排除 jsonp 因为我需要能够跨不同端口进行 POST 因此 我们为 Angular 应用程序设
  • Windows - 启动时自动启动特定应用程序

    在 Windows 操作系统中开发信息亭应用程序 当机器启动时 必须依次发生 3 件事 Node js 服务器启动 包含 Web 应用程序的浏览器以 kiosk 模式启动 另一个客户端应用程序启动 是否有一个实用程序可以轻松完成此操作 或者
  • Webpack 如何构建生产代码以及如何使用它

    我对 webpack 很陌生 我发现在生产构建中我们可以减少整体代码的大小 目前 webpack 构建的文件大小约为 8MB main js 的文件大小约为 5MB 如何减少生产构建中的代码大小 我从互联网上找到了一个示例 webpack
  • Scala 中的模式匹配是如何在字节码级别实现的?

    Scala 中的模式匹配是如何在字节码级别实现的 是不是像一系列if x instanceof Foo 构造 还是其他什么 它对性能有何影响 例如 给出以下代码 来自Scala 示例 http www scala lang org docu
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • 如何阻止 Eclipse 上的 JPA Facet 始终更新?

    我在 Eclipse 中有一个 EJB2 EJB3 Java 项目 我最近启用了 JPA Facet 现在安装了 Dali 并配置了对包含实际表和数据的 MySQL 数据库的访问 问题是 在 IDE Java 编辑器中编辑实体 bean 速
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • 获取 Blob 图像并将该图像转换为 Bitmap 图像

    我正在从数据库中获取 blob 格式的图像 我想将其转换为位图图像 我用来将位图转换为 Blob 的代码放在下面 但是请告诉我如何反转它 ByteArrayOutputStream boas new ByteArrayOutputStrea
  • 显示服务器端运行的长进程的状态

    我正在基于 Node js 的 Web 应用程序中进行 CSV 导入 大多数给定的 CSV 文件都有数万条记录 并且需要几分钟的时间 因此 在导入完成之前 我想向用户显示 当前正在导入 消息 我想要创建的内容类似于 Github 的分叉屏幕

随机推荐

  • 是什么意思[重复]

    这个问题在这里已经有答案了 这是代码 def my func f arg return f arg print lambda x 2 x x 5 gt gt gt
  • 控制笔记本相关表达式的 Rasterize[] 宽度

    Update向导先生的答案给出了像素完美的结果 但它仅适用于 Windows 并且会破坏剪贴板内容 我的答案应该适用于任何平台 但不太精确 例如它省略了输入 输出标签 但它确实允许设置光栅化宽度 这个问题我当时就出现了尝试为图像上传器制作预
  • WebStorm:如何美化 JavaScript 文件中引号中的 HTML

    我的中有以下块app component ts file Component selector my app template h1 title h1 h2 My Heroes h2 ul class heroes li li ul h2
  • 打开目录对话框

    我希望用户选择一个目录 用于保存我将生成的文件 我知道在 WPF 中我应该使用OpenFileDialog来自 Win32 但不幸的是 该对话框需要选择文件 如果我只是单击 确定 而不选择文件 它就会保持打开状态 我可以通过让用户选择一个文
  • 通过代码模拟触摸控制

    我正在尝试使用头部手势来浏览我的 Google Glass 应用程序 我能够识别头部姿势 例如向右看 向左看和向上看 他们每个人都有自己的方法来识别该手势时该怎么做 现在我需要在每个方法中模拟相应的触摸手势 所以它会认为我正在向左或向右滑动
  • C#:更改按钮背景颜色没有效果

    我在 Windows 窗体中使用 C 按钮时遇到问题 我以编程方式创建了许多按钮 然后将它们添加到表单中 有趣的是 除了修改按钮之外 对这些按钮 位置和大小 的每次修改BackColor很容易被执行 只有按钮的颜色保持不变 代码看起来像这样
  • Flash AS3 - 如何设置高质量录音

    目前 我正在使用 mic rate 100 这仅提供 63kbps Flash AS3 是否可以将比特率设置为高于 63kbps From the docs 可接受的值为 5 8 11 22 和 44 所以输入其中之一 根据文档 它的测量单
  • 如果没有父窗口,则无法在 PyQt 中创建新窗口

    我开始使用 PyQt 在 Python 中编写一个简单的文本编辑器 然后遇到了这个问题 对于 新文档 按钮 我想打开一个新的空文本编辑器 无论第一个窗口发生什么情况 它都会保持打开状态 问题是我让它显示窗口的唯一方法是发送self作为参数
  • 在经典的asp中读取csv文件。问题:列值被截断最多 300 个字符

    我有一个页面可以上传 csv 文件并保存到数据库中的表中 我正在使用下面的连接字符串来读取 csv 文件 set connection Server CreateObject ADODB Connection connection Open
  • 计算向量中零和一的百分比?

    我已经使用以下代码获得了矢量以及零和一的数量 u 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 transitions find u u 2 end u end 1 value u tr
  • Windows Phone 7 - 来电屏幕

    有没有办法在接到电话时将数据添加到来电屏幕 如果可能的话 我希望能够向该屏幕添加文本 Update 如果当前无法向该屏幕添加文本 是否有办法根据来电触发代码 您可以执行与来电相关的任何操作的唯一方法是通过 Obscured 事件得知此情况已
  • iOS 7 iPad Safari 横向innerHeight/outerHeight 布局问题

    我们发现 iOS 7 中 Safari 上高度为 100 的 Web 应用程序存在问题 似乎 window innerHeight 672px 与 window outerHeight 692px 不匹配 但仅限于横向模式 最终发生的情况是
  • filepicker.io Javascript API 调用导致不安全的 javascript 错误

    我目前正在使用 AngularJS 我想从我的上传控制器调用 filePicker pickAndStore 对 filepicker io API 函数的任何调用都会导致 不安全的 Javascript 尝试 错误 请求访问的帧具有 ht
  • SecurityError:操作不安全。使用 Htmlcanvas [重复]

    这个问题在这里已经有答案了 尝试转换图像我drag并将我的画布元素放入 PNG 或 Jpeg 照片中 有点类似于 Polyvore 的情绪板概念 这样我就可以在一张 PNG 或 Jpeg 照片中一次性查看放置在画布上的所有图像 这样我就可以
  • 在Javascript中实现优先级队列的有效方法?

    优先级队列对于每个条目都有一个优先级值和数据 因此 当向队列添加新元素时 如果它具有比集合中已有元素更高的优先级值 它就会冒泡到表面 当调用 pop 时 我们会获取具有最高优先级的元素的数据 在 Javascript 中 这种优先级队列的有
  • 使用未定义的 webpack 类捆绑 js 文件

    我将以下文件内容捆绑在一起 a js class BaseC doIt console log this class A extends BaseC b js class B extends BaseC var b new B b doIt
  • JSF:如何防止构建阶段由于递归而导致的堆栈溢出(尽管进行了渲染测试)

    对于没有在专用测试用例中抽象这个问题表示歉意 我希望来自真实项目的示例足够简单来描述问题 我有一个 JavaEE JPA2 JSF Web 应用程序 其中每个 Entity 元素 或子类 都有一个模板化 view xhtml 页面和一个标准
  • 使用 CI hook 设置公共变量

    我有几个常用变量 我想使用钩子来设置它们 例如 我有一个 post controller constructor 挂钩 在其中我想执行一些逻辑来设置用户主文件夹 public function post controller constru
  • Enterprise Library 3.1 日志格式化程序模板 - 包括 URL 请求

    我们有一个使用 Ektron v8 0 构建的自定义 Web 应用程序 该应用程序使用 EL 3 1 并且日志记录配置中的格式模板配置如下
  • 如何提高 MongoDB 批量性能?

    我有这个对象 其中包含一些元数据和大量项目 我曾经将其存储在 mongo 中 并通过以下方式查询它 unwind荷兰国际集团的数组 然而 在极端情况下 阵列变得如此之大 以至于我遇到了 16MB BSON 限制 所以我需要将数组的每个元素存