0

mongodb を使用してマルチエージェント シミュレーションを実行しようとしています。

シミュレーション プログラムを実行する同じサーバーに 1 つの 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 シェルは再び応答し、データベースにデータがあることを確認できますが、中断されます。この例では、エージェント 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

問題を解決しましたが、2 つのエラーがあります。

  • あまりにも多くのコレクションを作成していました。エージェントごとに 1 つのコレクションから、シミュレーション プロセスごとのコレクションのみに変更しました。

  • つながりを作りすぎていました。エージェントの反復ごとに 1 つの接続から、シミュレーション ステップごとに 1 つの接続のみに変更しました。

于 2013-04-04T10:33:25.393 に答える