我发现了这个讨论:MongoDB: Terrible MapReduce Performance .基本上它说尽量避免 Mongo 的 MR 查询,因为它是单线程的,根本不应该是实时的。 2 年过去了,我想知道从那时起发生了什么变化。现在我们有了 MongoDb 2.2。我听说 MR 现在是多线程的。请分享您对 MR 用于实时请求的想法,例如为 Web 应用程序频繁的 http 请求获取数据。能否有效利用索引?
最佳答案
这是 MongoDB 中 Map/Reduce 功能的当前状态
1) Map/Reduce 的大部分性能限制仍然存在于 MongoDB 2.2 版中。 Map/Reduce 引擎仍然要求将每条记录从 BSON 转换为 JSON,使用嵌入式 JavaScript 引擎执行实际计算(速度很慢),并且仍然存在单个全局 JavaScript 锁,它只允许单个 JavaScript 线程一次运行。
对分片集群的 Map/Reduce 进行了一些增量改进。最值得注意的是,最终的 Reduce 操作现在分布在多个分片上,并且输出也被并行分片。
我不建议在 MongoDB 2.2 版中使用 Map/Reduce 进行实时聚合
2) 从 MongoDB 2.2 开始,现在有一个新的聚合框架。这是聚合操作的新实现,用 C++ 编写,并紧密集成到 MongoDB 框架中。
大多数 Map/Reduce 作业都可以重写以使用聚合框架。它们通常运行速度更快(2.2 版本中常见的 Map/Reduce 速度提高了 20 倍),它们充分利用了现有的查询引擎,您可以并行运行多个聚合命令。
如果您有实时聚合需求,首先要从聚合框架入手。有关聚合框架的更多信息,请查看以下链接:
3) MongoDB 2.4 版中的 Map/Reduce 有了显着改进。 SpiderMonkey JavaScript 引擎已被 V8 JavaScript 引擎取代,不再有全局 JavaScript 锁,这意味着多个 Map/Reduce 线程可以并发运行。
Map/Reduce 引擎仍然比聚合框架慢很多,主要原因有两个:
解释 JavaScript 引擎,而聚合框架 运行编译后的 C++ 代码
JavaScript 引擎仍然要求每个被检查的文档都从 BSON 转换为 JSON;如果您将输出保存在集合中,则必须将结果集从 JSON 转换回 BSON
Map/Reduce 在 2.4 和 2.6 之间没有显着变化。
我仍然不建议在 MongoDB 2.4 或 2.6 版本中使用 Map/Reduce 进行实时聚合。
4) 如果你真的需要 Map/Reduce,你也可以看看 Hadoop Adaptor。这里有更多信息:
关于mongodb - MongoDb 2.2、2.4 和 2.6 中的 Map-Reduce 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678631/
我们刚刚将ruby更新到2.6,将bundler更新到2。现在我们得到:#bin/railsconsoleYoumustuseBundler2orgreaterwiththislockfile.这以前发生在bundleexec中:#bundleexecrailsconsoleYoumustuseBundler2orgreaterwiththislockfile.那时我们仍然默认运行1.17.2:#gemlistbundler***LOCALGEMS***bundler(2.0.1,default:1.17.2)所以我们运行gemuninstallbundler--version1.
我最近使用RVM从Ruby2.2.2升级到2.2.3。这搞砸了我的开发环境中的一些事情,但由于有用的错误消息,到目前为止我可以处理它。现在我想向我的数据库添加一些迁移,但遇到了这个错误:$rakedb:migrate/Users/howard/.rvm/gems/ruby-2.2.3/bin/ruby_executable_hooks:15:in`eval':/Users/howard/.rvm/rubies/ruby-2.2.3/bin/rake:4:syntaxerror,unexpectedtSTRING_BEG,expectingkeyword_door'{'or'('(Syn
我想在ruby中模拟我对像hadoop这样的系统的map和reduce函数的实现,以验证这个想法至少有效。我有以下问题。我有两个元素列表:List13-A4-B5-C7-D8-FList22-A8-B6-C9-D4-E我需要构建一个公共(public)列表,其中包括与两个列表中公共(public)字母关联的数字总和:commonList5-A12-B11-C16-D我想用map和reduce操作制作一个ruby脚本来解决这个问题。我不确定如何解决这个问题或在ruby脚本中模拟这个问题要遵循什么程序。感谢任何帮助。 最佳答案
我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多
我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序
(本题试图找出为什么一个程序在不同的处理器上运行会有所不同,所以它与编程的性能方面有关。)以下程序在配备2.2GHzCore2Duo的Macbook上运行需要3.6秒,在配备2.53GHzCore2Duo的MacbookPro上运行需要1.8秒。这是为什么?这有点奇怪……当CPU的时钟速度仅快15%时,为什么要加倍速度?我仔细检查了CPU仪表,以确保2个内核中没有一个处于100%使用率(以便查看CPU是否忙于运行其他东西)。难道是因为一个是MacOSXLeopard,一个是MacOSXSnowLeopard(64位)?两者都运行Ruby1.9.2。pRUBY_VERSIONpRUBY_
我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")
我正在尝试使用聚合框架(使用ruby)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u
我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结
当我fork我的进程时,如何防止GC引发写时复制?由于我在我的程序中遇到了一些内存问题(我的60核0.5Tb机器上的内存不足,即使是相当小的任务),我最近一直在分析Ruby中垃圾收集器的行为。对我来说,这确实限制了ruby在多核服务器上运行程序的实用性。我想在这里展示我的实验和结果。当垃圾收集器在fork期间运行时会出现此问题。我调查了三个案例来说明这个问题。案例一:我们使用数组在内存中分配了很多对象(不超过20字节的字符串)。字符串是使用随机数和字符串格式创建的。当进程fork并且我们强制GC在子进程中运行时,所有共享内存都变为私有(private),导致初始内存重复。案例2:我