0

我尝试使用 mongodb 运行多代理模拟。

我在运行模拟程序的同一服务器中有一个 mongo 实例,但是当我有太多代理(在 10 个模拟步骤中约为 100.000 个)时,mongodb 会在几秒钟内停止。

mongo中插入数据的代码类似于:

if( mongo_client( &m_conn , m_dbhost.c_str(), m_dbport ) != MONGO_OK ) {
    cout << "failed to connect '" << m_dbhost << ":" << m_dbport << "'\n";
    cout << "  mongo error: " << m_conn.err << endl;
    return;
}
bson_init( &b );
bson_append_new_oid( &b, "_id" ) != BSON_OK );
bson_append_double( &b, "time", time );
bson_append_double( &b, "x", posx );
bson_append_double( &b, "y", posy );
bson_finish( &b );

if( mongo_insert( &m_conn , ns.c_str() , &b, NULL ) != MONGO_OK ){
    cout << "failed to insert in mongo\n";
}
bson_destroy( &b );
mongo_disconnect( &m_conn );

另外,在模拟过程中,如果我尝试使用 mongo-shell 访问,我也会收到错误消息:

$ mongo
MongoDB shell version: 2.4.1
connecting to: test
Wed Apr  3 10:10:24.870 JavaScript execution failed: Error: couldn't connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:L112
exception: connect failed

模拟结束后,mongo shell 再次响应,我可以检查数据库中有数据但已中断。在示例中,代理 m0n999 仅保存了 10 个步骤中的 6 个:

> show dbs
dB0B7F527F0FA45518712C8CB27611BD7   5.951171875GB
local   0.078125GB
> db.ins.m0n999.find()
{ "_id" : ObjectId("515bdf564c60ec1e000003e7"), "time" : 1, "x" : 1.1, "y" : 8.1 }
{ "_id" : ObjectId("515be0214c60ec1e0001075f"), "time" : 2, "x" : 1.2000000000000002, "y" : 8.2 }
{ "_id" : ObjectId("515be1c04c60ec1e0002da3a"), "time" : 4, "x" : 1.4000000000000004, "y" : 8.399999999999999 }
{ "_id" : ObjectId("515be2934c60ec1e0003b82c"), "time" : 5, "x" : 1.5000000000000004, "y" : 8.499999999999998 }
{ "_id" : ObjectId("515be3664c60ec1e000497cf"), "time" : 6, "x" : 1.6000000000000005, "y" : 8.599999999999998 }
{ "_id" : ObjectId("515be6cc4c60ec1e000824b2"), "time" : 10, "x" : 2.000000000000001, "y" : 8.999999999999996 }
> 

如何解决这个问题?如何避免丢失连接并从 mongo 档中恢复?

更新 我收到了全局日志错误,例如:

    "Wed Apr  3 11:53:00.379 [conn1378573] error: hashtable namespace index max chain reached:1335",
    "Wed Apr  3 11:53:00.379 [conn1378573] error: hashtable namespace index max chain reached:1335",
    "Wed Apr  3 11:53:00.379 [conn1378573] error: hashtable namespace index max chain reached:1335",
    "Wed Apr  3 11:53:00.379 [conn1378573] error: hashtable namespace index max chain reached:1335",
    "Wed Apr  3 11:53:00.379 [conn1378573] end connection 127.0.0.1:40748 (1 connection now open)",
4

1 回答 1

0

我解决了这个问题,它有两个错误:

  • 我正在创建太多的集合。我从每个代理一个收集更改为每个模拟过程仅收集一个。

  • 我创造了太多的联系。我从每次代理迭代一个连接更改为每个模拟步骤只有一个连接。

于 2013-04-04T10:33:25.393 回答