3

「test」という名前のコレクションが1つある非常に単純なmongodbデータベースがあり、コレクションに133.306レコードを挿入する必要があります。これらのレコードはJSONファイルに保存されます。このファイルのサイズは21Mbです。50.000レコードが1秒で正常に挿入されます。70.000レコードの挿入により、スクリプトがハングします。

コード:

var path = require('path'),
    fs = require('fs'),
    mongodb = require('mongodb'),
    safe = { safe : true },
    rowset;

rowset = JSON.parse(fs.readFileSync(path.join(__dirname, 'test.js')));
console.log('Total records: ' + rowset.length);
rowset = rowset.slice(0, 50000); // OK
// rowset = rowset.slice(0, 70000); // FAIL
console.log('Inserting ' + rowset.length + ' records');

mongodb.MongoClient.connect('mongodb://127.0.0.1:27017/browser',
    function (err, client) {
        if (err) throw err;

        client.createCollection('test', safe, function (err, collection) {
            if (err) throw err;

            collection.insert(rowset, safe, function (err) {
                if (err) throw err;

                client.close(function (err) {
                    if (err) throw err;

                    console.log('done');
                });
            });
        });
    });

mongod出力の最後の数行:

Wed Dec 26 16:50:46 [initandlisten] connection accepted from 127.0.0.1:52003 #854 (4 connections now open)
Wed Dec 26 16:50:46 [initandlisten] connection accepted from 127.0.0.1:52004 #855 (5 connections now open)
Wed Dec 26 16:50:46 [initandlisten] connection accepted from 127.0.0.1:52005 #856 (6 connections now open)

これは、行セットからの典型的なレコードです。

{ _id: 133306,
  product: 23089,
  version: '1.0.0',
  update: null,
  edition: null,
  lang: null,
  entries: [ 54344, 54345 ] }

たぶん、スクリプトはいくつかのしきい値または制限に達しますか?

4

1 に答える 1

3

私はあなたが言ったタイプの150000エントリで私のコンピュータであなたのスクリプトをテストしました、そしてそれは魅力のように働きました。このプロセスでは、20MBのjsonファイルにさらに140MBのRAMが必要でした。

このコマンドを使用して、mongodbから開かれた接続を監視できます。

db.$cmd.sys.inprog.findOne( { $all : true } )

アップデート:

600000エントリを挿入しようとしましたが、ハングしました。あなたが正しい。この場合、mongoimportを使用する必要があります。1 000 000エントリのファイルを生成し、mongoimportが1分以内にそれらを挿入しました。私が世話をしているいくつかの問題:インポートファイルは次のようにフォーマットする必要がありますBSON(jsonのスーパーセット):

 {"product": 23089,"version": "1.0.0","update": null,"edition": null,"lang": null,"entries": [ 54344, 54345 ]}
 {"product": 23089,"version": "1.0.0","update": null,"edition": null,"lang": null,"entries": [ 54344, 54345 ]}
 {"product": 23089,"version": "1.0.0","update": null,"edition": null,"lang": null,"entries": [ 54344, 54345 ]}
  • 1行に1つのドキュメント

  • ドキュメント間にコンマ区切りはありません

  • それらを配列に含めないでください[]

インポートに使用したコマンドは次のとおりです。

c:\mongodb\bin>
mongoimport --collection browser12 --file E:\Nodejs\StackOverflow.com\Mongodb\veryBigjson.json --dbpath C:\mongodb\data --port 27016 -d browser12 --ignoreBlanks
于 2012-12-26T20:18:59.943 に答える