我们目前正在探索MongoDB中的Capped Collections和Tailable Cursors来创建一个通知排队系统.但是,在创建一个简单的 LinqPad测试(下面的代码)后,我们注意到在运行时,Mongo不断分配内存,直到没有更多可用资源,即使我们没有插入任何记录.这种分配一直​​持续到使用所有系统RAM为止,此时Mongo只是停止响应.

由于我们是Capped Collections和Tailable Cursors的新手,我想确保在提交错误之前我们没有错过任何明显的东西.

注意:我们尝试使用以下代码打开和关闭日记,但结果相同.

>平台:Windows Server 2012 64位
> MongoDB:版本2.4.8 64位
>司机:官方C#10gen v1.8.3.9

Linqpad脚本

var conn = new MongoClient("mongodb://the.server.url").GetServer().GetDatabase("TestDB");

if(!conn.CollectionExists("Queue")) {

    conn.CreateCollection("Queue",Collectionoptions
        .SetCapped(true)
        .SetMaxSize(100000)
        .SetMaxDocuments(100)
    );

    //Insert an empty document as without this 'cursor.IsDead' is always true
    var coll = conn.GetCollection("Queue");
    coll.Insert(
        new BsonDocument(new Dictionary<string,object> {
            { "PROCESSED",true },}),WriteConcern.UnackNowledged
    );
}

var coll = conn.GetCollection("Queue");
var query = coll.Find(Query.EQ("PROCESSED",false))
    .SetFlags(QueryFlags.AwaitData | QueryFlags.NoCursorTimeout | QueryFlags.TailableCursor);

var cursor = new MongoCursorEnumerator<BsonDocument>(query);

while(true) {
    if(cursor.MoveNext()) {
        string.Format(
            "{0:yyyy-MM-dd HH:mm:ss} - {1}",cursor.Current["Date"].ToUniversalTime(),cursor.Current["X"].Asstring
        ).Dump();

        coll.Update(
            Query.EQ("_id",cursor.Current["_id"]),Update.Set("PROCESSED",true),WriteConcern.UnackNowledged
        );
    } else if(cursor.IsDead) {
        "DONE".Dump();
        break;
    }
}

解决方法

看来我找到了问题的解决方案!!

上述代码中的问题围绕查询:

Query.EQ("PROCESSED",false)

当我删除它并用基于文档ID的查询替换它时,内存消耗问题消失了.在进一步思考时,查询中不需要这个“PROCESSED”属性作为cursor.MoveNext()将始终返回下一个新文档(如果有的话).下面是基于以上代码重构的LinqPad脚本….

var conn = new MongoClient("mongodb://the.server.url").GetServer().GetDatabase("TestDB");

if(conn.CollectionExists("Queue")) {
    conn.DropCollection("Queue");
}

conn.CreateCollection("Queue",Collectionoptions
    .SetCapped(true)
    .SetMaxSize(100000)
    .SetMaxDocuments(100)
    .SetAutoIndexId(true)
);

//Insert an empty document as without this 'cursor.IsDead' is always true
var coll = conn.GetCollection("Queue");
coll.Insert(
    new BsonDocument(new Dictionary<string,object> {
        { "PROCESSED",{ "Date",DateTime.UtcNow },{ "X","test" }
    }),WriteConcern.UnackNowledged
);

//Create query based on latest document id
BsonValue lastId = BsonMinKey.Value;
var query = coll.Find(Query.GT("_id",lastId))
    .SetFlags(QueryFlags.AwaitData | QueryFlags.NoCursorTimeout | QueryFlags.TailableCursor);

var cursor = new MongoCursorEnumerator<BsonDocument>(query);

while(true) {
    if(cursor.MoveNext()) {
        string.Format(
            "{0:yyyy-MM-dd HH:mm:ss} - {1}",cursor.Current["X"].Asstring
        ).Dump();
    } else if(cursor.IsDead) {
        "DONE".Dump();
        break;
    }
}

c# – MongoDB 2.4.8上限集合和tailable游标消耗所有内存的更多相关文章

  1. ios – UITextField secureEntry错位了游标

    我在UITextField上切换secureEntry属性时遇到问题.切换属性时,将调整字符大小,但光标位于错误的位置:解决方法这是我的解决方法:禁用然后启用UITextField也有帮助,但它会突然将我的软键盘从一个更改为另一个

  2. Swift 如何访问 MongoDB

    Perfect开源项目参与Perfect开发Slack在线协同MongoDBMongoDB库函数是在mongo-c语言库的基础上封装而成,能够为Swift轻松访问MongoDB服务器提供便利。请确保安装并激活了最新版本的Swift3.0toolchain。注意每次向项目追加依存关系时,必须要打开Swift软件包管理器重新创建一个新的Xcode项目文件。在您的项目中声明MongoDB请在您的Perfect项目源程序开头声明并导入MongoDB函数库:创建一个MongoDB数据库连接创建到MongoDB服务器

  3. android – 如何更改EditText游标高度?

    我想改变EditText游标高度,有谁知道怎么做?

  4. android,游标返回布尔值?

    AndroidCursor可以返回一个布尔值吗?我查看了文档,但没有相关信息?解决方法sqlite3的android实现不能正确支持布尔值.您将需要使用设置为0或1的整数并编写一些代码以将其转换为布尔值,例如

  5. Android:我需要关闭Cursor对象吗?

    在我的数据库适配器类中,我有很多这样的方法:我很欣赏这种方法的简洁性.但我不是在调用Cursor.close(),我不确定这是不是问题.是否会关闭Cursor并在Cursor.finalize()中释放其资源?否则我将不得不这样做:解决方法是的,建议在使用该游标对象时关闭游标,以便游标可以在关闭时执行任何保持工作的内容.

  6. android – EditText游标位于提示后

    我的应用程序中有一个简单的登录活动,包含电子邮件和密码字段.电子邮件EditText中的提示和光标位置存在一个奇怪的问题:从图像中可以看出,默认情况下,光标不在第一个位置.它在提示后显示就布局而言,密码EditText与电子邮件密码相同,但它没有此问题:任何人都知道为什么会这样?这是活动的布局:如果需要任何其他代码部分,请告诉我添加它.解决方法试试我的代码:这个对我有用.

  7. android – 除了过早调用cursor.close()之外,什么可能导致StaleDataException?

    )简而言之,我在使用中找不到任何光标关闭的原因.那么,StaleDataException的其他原因是什么?

  8. TP5(thinkPHP5)框架mongodb扩展安装及特殊操作示例

    这篇文章主要介绍了TP5(thinkPHP5)框架mongodb扩展安装及特殊操作,结合实例形式分析了MongoDB扩展的基本安装、配置、模型操作以及使用Push操作实现的数据添加、更新等方法,需要的朋友可以参考下

  9. Node.js和MongoDB实现简单日志分析系统

    这篇文章主要介绍了Node.js和MongoDB实现简单日志分析系统,本文给出了服务器端、客户端、图表生成、Shell自动执行等功能的实现代码,需要的朋友可以参考下

  10. Laravel框架中集成MongoDB和使用详解

    今天小编就为大家分享一篇Laravel框架中集成MongoDB和使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部