MongoDB GridFS 对于相对较小的文件来说文件大小很大

2023-12-03

我正在做一些测试,看看我们是否可以在 MongoDB 上使用 GridFS 来存储未来应用程序的文件;我正在使用 10gen 的 C# 驱动程序将 80Mb 文件“上传”到数据库中。

第一次添加效果很好,大约花费了 3 秒,这在我的测试机上还算不错;然而,未来添加同一文件需要更长的时间,长达 30 秒,最终 MongoDB 告诉我内存不足并崩溃了。

添加 10 个大小为 80Mb 的文件会导致在系统崩溃之前为我的数据库创建 8 个名为 dbaseName.0 到 dbaseName.7 的文件,它们的文件大小从文件 0 到 5 呈指数增长,从 16Mb 到 512Mb,然后文件 6 和 7 都是512MB。

这些文件的大小略低于 2Gb,显然第 10 次添加文件会使数据库超过 2Gb,这超出了我的 32 位测试版本的限制。

为什么存储 800Mb 的文件需要占用 2Gb 的空间?有没有我错过的地方?

MongoDB 是否将整个 GridFS 持续保存在 RAM 中?如果是的话,磁盘还有什么意义呢?如果我的生产服务器上只有 32Gb RAM,我只能在 GridFS 中存储 32Gb 吗?

我在 MongoGridFS 对象上使用 EnsureIndexes,并且检查了数据库,该数据库显示为 GridFS 创建了索引,所以 Mongo 肯定不应该尝试将整个数据存储放入 RAM 中吗?

MongoDB 满足我们所有的需求,但我们需要它能够容纳大文件集合;我错过了一些明显的东西吗?

堆栈跟踪:

Mon Oct 15 11:57:15 [conn15] insert busyNow.fs.chunks keyUpdates:0 locks(micros) w:112892 113ms
Mon Oct 15 11:57:15 [conn15] MapViewOfFileEx for /data/db/busyNow.7 failed with errno:8 Not enough storage is available to process this command. (file size is 536608768) in MemoryMappedFile::map

Mon Oct 15 11:57:15 [conn15]  busyNow.fs.chunks Fatal Assertion 16166
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\assert_util.cpp(124)                               mongo::fassertFailed+0x75
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\mmap_win.cpp(211)                                  mongo::MemoryMappedFile::map+0x4ce
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\mongommf.cpp(182)                                    mongo::MongoMMF::create+0xa3
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(469)                                      mongo::MongoDataFile::open+0x141
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(280)                                    mongo::Database::getFile+0x34f
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(332)                                    mongo::Database::suitableFile+0x129
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(359)                                    mongo::Database::allocExtent+0x41
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1271)                                     mongo::outOfSpace+0x107
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1293)                                     mongo::allocateSpaceForANewRecord+0x5d
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1463)                                     mongo::DataFileMgr::insert+0x493
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1217)                                     mongo::DataFileMgr::insertWithObjMod+0x33
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(761)                                    mongo::checkAndInsert+0x72
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(821)                                    mongo::receivedInsert+0x4cd
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(434)                                    mongo::assembleResponse+0x62a
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\db.cpp(192)                                          mongo::MyMessageHandler::process+0xe8
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\net\message_server_port.cpp(86)                    mongo::pms::threadRun+0x424
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\third_party\boost\boost\thread\detail\thread.hpp(62)          boost::detail::thread_data<boost::_bi::bind_t<void,void (__cdecl*)(mongo::MessagingPort *),boost::_bi::list1<boost::_bi::value<mongo::MessagingPort *
> > > >::run+0x9Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\third_party\boost\libs\thread\src\win32\thread.cpp(16707566)  boost::`anonymous namespace'::thread_start_function+0x47
Mon Oct 15 11:57:17 [conn15] mongod.exe  f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c(314)                _callthreadstartex+0x1b
Mon Oct 15 11:57:17 [conn15] mongod.exe  f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c(292)                _threadstartex+0x64
Mon Oct 15 11:57:17 [conn15]

***aborting after fassert() failure


Mon Oct 15 11:58:33 [initandlisten] connection accepted from 127.0.0.1:56308 #16 (3 connections now open)

好的;经过大量搜索后,MongoDB 似乎在指数大小的文件中预先分配了最多 2GB 的空间,之后每个文件将为 2G。

http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

我的测试程序在后台文件(.0 - .7 等)中添加 80Mb 文件,并且当数据块开始写入最后一个文件时,Mongo 会预分配另一个比上一个文件大得多的文件。

因此,第一个 80Mb 文件填满了 16Mb 文件、32Mb 文件和 64Mb 后台文件,并且由于元数据占用了更多空间,并且必须稍微侵占 128Mb 文件,这会触发 mongo 预分配总共 256Mb 文件496MB;随着更多文件的添加,更多文件被预分配,当我的测试机器上达到 2Gb 时,Mongo 无法访问该空间并崩溃。

因此,尽管看起来一个 80Mb 文件占用的空间比应有的多得多,但从某种意义上讲,这是有道理的。

这可以通过使用 --noprealloc 运行 mongod 来关闭,尽管建议仅在测试机器上这样做。

感谢您的回复!

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

MongoDB GridFS 对于相对较小的文件来说文件大小很大 的相关文章

  • Express MongoDB find() 基于 _id 字段

    因此 在我的 Express 应用程序中 我尝试根据我的 id 字段查找 请参阅下面我的 MongoDB 记录 id oid 58c2a5bdf36d281631b3714a title EntertheBadJah subTitle Lo
  • 如何在 Mongoose 中定义排序函数

    我正在开发一个小型 NodeJS Web 应用程序 使用 Mongoose 访问我的 MongoDB 数据库 我的收藏的简化架构如下 var MySchema mongoose Schema content type String loca
  • mongodb C# 异常无法从 BsonType Int32 反序列化字符串

    我是在 C 中使用 mongo db 的新手 但我正在尝试在 mongo db 中导入大型数据库 MyDb 由仅具有简单参数 Id Body Title Tags 的实体组成 这是 mongo 中实体的示例 Id someff asdsa
  • 为什么 Casbah / Java MongoDB 驱动程序最终会出现 java.lang.IllegalArgumentException?

    我使用时看到一个奇怪的问题casbah java driver 当驱动程序尝试从 mongo 创建响应时 我不断遇到以下异常 Oct 16 2012 10 45 07 AM com mongodb DBTCPConnector MyPort
  • 为什么我在 Nodejs 中收到“在将标头发送到客户端后无法设置标头”错误?

    我正进入 状态 Cannot set headers after they are sent to the clientNodejs 中出现错误 我无法弄清楚原因 代码如下 我正在使用 mongoose 将数据保存在 mongodb 中 我
  • 在 mongodb 中更新异步重复数据的最佳实践

    我正在权衡 Web 应用程序从关系 SQL 数据库迁移到 mongodb 的利弊 这是为了解决性能问题 将所有对象依赖项存储在对象本身中允许快速 读 用于向用户显示数据 另一方面 某些数据存在于不同的集合中 例如用户名位于用户集合中 但也在
  • 如何在 mongodb-native findAndModify 中使用变量作为字段名称?

    在使用 mongodb native 驱动程序的这段代码中 我想增加在单独变量中指定的字段的值 问题在于 在这种情况下 inc 子句中的字段名称将是 变量 而不是变量的内容 在查询部分中 所选变量按预期工作并找到正确的 ID var sel
  • mongoid 中的嵌入文档与哈希数据类型

    我找不到任何讨论此问题的博客文章或文档 它们 嵌入式文档和哈希数据类型 非常相似 彼此相比有何好处或限制 考虑我的架构设计 class HistoryTracker include Mongoid Document include Mong
  • S3 的 Rails 回形针默认图像

    我尝试在应用程序中使用default url 但我使用S3 存储图像 我不确定我需要在那里输入什么 URL 或者我是否必须创建一个假图像才能将所有内容放在那里 由于我的图像总是通过 S3 渲染 所以我不知道如果我只是在公共文件夹中放入一些默
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • MongoDB的ObjectId是如何生成的?

    他们是吗somewhat随机的 我的意思是 人们能够将它们分开吗 它们不是随机的 可以很容易地预测 BSON ObjectID 是一个 12 字节值 由 4 字节时间戳组成 自纪元以来的秒数 一个 3 字节 机器 ID 2 字节进程 ID
  • Mongo $group 和 $project

    我正在尝试获取关键字计数parentId categioryId and llcId 我的数据库是 id ObjectId 5673f5b1e4b0822f6f0a5b89 keyword electronic content manage
  • 如何修复 MongoClient is not a constructor 错误

    我刚刚学习 JavaScript 和 Nodejs 根据我在网上找到的一些代码 我编写了以下应用程序 当我尝试运行它时 我在第 9 行收到错误 其中显示 new MongoClient 错误提示 MongoClient 不是构造函数 您能解
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • 在 shell/shell 脚本中设置 MongoDB 写关注

    我正在尝试填充一个集合MongoDB的壳 据我了解 使用轻松的Write Concern可以大大加快这个过程 我说的是文档 http docs mongodb org manual core write concern write oper
  • mongoengine 操作的原子性如何

    我正在尝试在对象的状态之间转换 如下所示 User objects id user id state STATE WAITING update one set state STATE FINISHED The question是 是否存在这
  • mongo BadValue 未知运算符:$or

    该集合有一份文档 id ObjectId 54b513933aca242d9915a787 carriers carrier ObjectId 54b54d223aca242d9915a788 carryingInterval from I
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • 相同的单词但不同的 unicode 字符

    我在 Windows 上使用 Python 构建了一个关于越南餐馆的问答应用程序 要编写越南语字符 我需要使用 Unicode 首先 我从使用 HTML charset utf 8 的 TripAdvisor 网站克隆数据并构建我的 Mon
  • Java 驱动程序相当于 JavaScript shell 的 Object.bsonsize( doc )?

    我想知道 Java 驱动程序相当于 Mongo JavaScript shell 的 Object bsonsize doc 方法 例如 执行以下操作的 Java 代码是什么 bobk mbp bobk mongo MongoDB shel

随机推荐

  • 修改Android选中下拉项的颜色

    如何修改 Android Honeycomb 应用程序中 Spinner 上所选项目的文本颜色 编辑 我有一个正在膨胀的旋转布局 是否可以在此微调器中添加属性来更改文本颜色 我能够更改背景 例如使用微调器上的 android backgro
  • 设计可插入积分和徽章系统[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 如何设计一个可插拔积分和徽章系统 既易于打开和关闭 又易于变成自己的模块 经过多次试验和错误 我得出的结论是 积分和徽章与应用程序的唯一业务逻辑过于交织在一起 无法以简单的方式将它们具
  • 获取长列表并将其重新整形为数据框“行” - pandas python 3

    我有一长串项目 我想按照设定的时间间隔将其放入数据框中 我有另一个带有 列名称 的列表 E g colnames Title Date Abstract ID Volume data a b c d e f g h i j k l m n
  • Python pandas 计算字符串中正则表达式匹配的数量

    我有一个包含句子的数据框和按主题分组的术语词典 我想在其中计算每个主题的术语匹配数 import pandas as pd terms animals fox deer eagle people John Rob Steve games b
  • 在插入时插入当前日期

    我有一个具有以下结构的表 id some column another column inserted edited 1 2014 08 15 2016 03 04 2 2015 09 16 2016 10 07 3
  • 用于向数组添加元素的 PowerShell 函数

    我对 PowerShell 还很陌生 并且正在尝试创建一些组合在一起的函数来创建和管理数组 我在使这些功能之一按预期工作时遇到一些问题 我需要第二个函数 AddToArray 将元素添加到指定索引 任何现有元素都不能被覆盖或删除 例如 如果
  • 如何在 powershell 中创建包含普通数组的非托管结构?

    我需要在 Powershell 脚本中组装一个 Blob 显示以下布局 Pragma pack 1 struct MyConfig uint16 t level uint16 t thresholds 16 the struct conta
  • [数组/对象]中的[文字]是什么意思?

    以下语法的含义是什么 1 in 1 2 3 5 我知道它不会在数组中搜索 1 但它有什么作用呢 我见过它在循环中使用 for var i in testArray 但也看到过它本身被使用 这是否意味着检查文字是否是另一个操作数的数组或对象中
  • 静态数据成员未通过套接字在对象发送中发送

    我想为两个客户端发送相同的对象 我使用对象写入非共享方法并读取非共享方法 我的对象的类是 package servidor import java io Serializable public class Token implements
  • 从不同数据库导入的语法 - MS Access

    我正在尝试 基本上 从一个后端到另一个后端进行自动行复制 因为后端正在使用但尚未完全开发 一些表已完成 其他表未完成 最后将完整的数据添加到更高级的数据库中 当日 我想知道 SQL 语句的语法是什么 INSERT INTO tblMyBet
  • 为什么编程中需要指针? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 使用任何语言 例如 C 语言 编写代码时使用指针是否重要 它会占用更多内存吗 Thank
  • F# UnitTest 项目中的 AutoFixture 未在测试资源管理器中显示单元测试

    我有一个 Visual Studio 2012 项目并安装了以下 NuGet 包 使用最小起订量进行自动模拟的 AutoFixture Autofixture 与 xUnit net 数据理论 汽车夹具 Moq xUnit net 扩展 x
  • 有没有更短的方法来实现这个功能?

    B front x 给定一个字符串列表 返回一个按排序顺序包含字符串的列表 但首先对所有以 x 开头的字符串进行分组 例如 mix xyz apple xanadu aardvark 产生 xanadu xyz aardvark apple
  • 如何使用 Highcharter 创建两个独立的钻取图?

    我正在开发包含两个向下钻取图表的闪亮应用程序 两者都从同一数据文件读取 唯一的区别是第一个图表执行求和 而第二个图表获取平均值 问题是无论我做什么改变 两个图表仍然冲突 这是使用的代码 cate lt c Furniture Furnitu
  • Rails 4 WYSIWYG Bootsy 不显示格式

    我刚刚按照安装说明进行操作靴子宝石页面在我保存并查看帖子内容之前 一切看起来都很好 视图中的输出如下所示 h2 Header h2 h3 Sub head h3 br img alt Thumb 1320236280147 src uplo
  • 使用来自另一个“类接口或预期枚举”的一个包时出错

    package students import java util public class p1 private int n1 2 int n2 3 protected int n3 5 public int n4 7 package s
  • 从包含键路径的字符串中获取json值[重复]

    这个问题在这里已经有答案了 我有一个输入数组 路径如下 var path foo bar baz 而且我有一个对象 var obj foo bar baz cake notbar another value 我想更改路径中的 baz 值 我
  • 如何向 MapBox GL JS 地图添加标记?

    我正在尝试将标记添加到 HTML Javascript 地图中的 MapBox GL JS 地图 我尝试构建一个小示例 这是我的代码
  • 如何在 MATLAB 中合并这些数据?

    在下面的示例文本文件中 如果第 3 列包含1那么第 2 列对应的数据应该与第 2 列中前一行的数据合并 例如 40第 2 行中应添加到10在第 1 行中 则第 2 行应设置为0 如修改后的示例文本文件所示 我下面的代码的问题是它只记录当前数
  • MongoDB GridFS 对于相对较小的文件来说文件大小很大

    我正在做一些测试 看看我们是否可以在 MongoDB 上使用 GridFS 来存储未来应用程序的文件 我正在使用 10gen 的 C 驱动程序将 80Mb 文件 上传 到数据库中 第一次添加效果很好 大约花费了 3 秒 这在我的测试机上还算