我目前在生产中使用 mongo,到目前为止我对它很满意。我只是想更好地了解如何提高吞吐量。我的理解可能存在核心差距,我正在努力填补这一差距。
我目前有一个相对较小的数据集(不到 500 万个文档)。作为我的应用程序的一部分,我必须每天轮换数据,这意味着我将在集合中插入 1M 到 5M 之间的某个位置并滚出旧数据。我可以使用两个集合很容易地做到这一点,其中一个是沙盒集合,新数据被注入(inject)其中,完成后,我将它重命名为“实时”集合,这样它就非常快而且我不必等待一个 remove() 来完成。
我当前的问题是,在我的服务器上,这是一个带有 16gb 内存的四核 linux 机器,我的数据无法超过每秒约 2k 次更新。在我插入所有数据(1M+)后,我有各种读取然后更新记录的后处理。该过程在功能上运行良好,但无论我尝试什么,我每秒都不能超过 4K(读+写)。
我已将集合上的索引修剪为我需要的几个单个字段索引,并且尝试了各种方法,例如使用单个 esb ssd 假脱机处理 ec2 mediumxlarge 实例,我得到了相同的结果。我也尝试过 fork 读取/更新数据的工作进程,无论我在上面放置多少工作人员,最大操作数都没有真正移动。
此外,我的后期处理与 mongo 服务器在同一个机器上运行,因此这里没有网络延迟等问题。 post process 运行时,cpu 比较安静,偶尔会出现 50% 左右的峰值。我还注意到在此过程中我的锁定百分比很高,但我猜这仅仅是因为我对集合发布了太多更新。在我的后期处理过程中,锁定 % 状态为 80+%。
我的平均文档大小约为 1.4k。集合上有 6 个字段级索引。典型的后处理(使用 Node )将流式传输所有具有字段 x = y 的文档,更新该记录上的不同字段,然后保存它。在这个过程中会发生一些计算。起初我认为我的计算是瓶颈,所以为了解决我正在 fork 多个 (4) Node 子进程并且每个子进程不超过 40% 的 cpu。我非常有信心我的申请没问题。如果我使用 1 或 4 个 Node 进程,我大约需要 20 分钟才能完成 1M 文档。
最佳答案
您无能为力,当您更新其中的单个文档时,mongodb 会锁定整个集合。因此在更新期间读取被阻止。
Version 3.0应该通过使用 WiredTiger 存储引擎引入文档级锁定来改进这一点。
关于node.js - 每秒真实世界的 mongo 查询/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575681/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s