13

次の形式の JSON ドキュメントが 1,000 万件以上あります。

["key": "val2", "key1" : "val", "{\"key\":\"val", \"key2\":\"val2"}"]

1 つのファイルで。

JAVA Driver API を使用したインポートには約 3 時間かかりましたが、次の機能 (一度に 1 つの BSON をインポート) を使用していました。

public static void importJSONFileToDBUsingJavaDriver(String pathToFile, DB db, String collectionName) {
    // open file
    FileInputStream fstream = null;
    try {
        fstream = new FileInputStream(pathToFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("file not exist, exiting");
        return;
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

    // read it line by line
    String strLine;
    DBCollection newColl =   db.getCollection(collectionName);
    try {
        while ((strLine = br.readLine()) != null) {
            // convert line by line to BSON
            DBObject bson = (DBObject) JSON.parse(JSONstr);
            // insert BSONs to database
            try {
                newColl.insert(bson);
            }
            catch (MongoException e) {
              // duplicate key
              e.printStackTrace();
            }


        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }


}

もっと速い方法はありますか?たぶん、MongoDB の設定が挿入速度に影響するのではないでしょうか? (たとえば、インデックスとして機能する key : "_id" を追加すると、MongoDB が人工キーを作成して各ドキュメントのインデックスを作成する必要がなくなります) または、挿入時にインデックスの作成をまったく無効にします。ありがとう。

4

7 に答える 7

5

~250M レコードを含む複数行の json ファイルをインポートしました。mongoimport < data.txt を使用するだけで、10時間かかりました。あなたの 10M 対 3 時間と比較すると、これはかなり速いと思います。

また、私の経験から、独自のマルチスレッド パーサーを作成すると、処理速度が大幅に向上します。手順は簡単です。

  1. ファイルを BINARY (TEXT ではありません!) として開きます。
  2. ファイル全体に均等にマーカー (オフセット) を設定します。マーカーの数は、必要なスレッドの数によって異なります。
  3. マーカーの近くで '\n' を検索し、マーカーを調整して線に合わせます。
  4. 各チャンクをスレッドで解析します。

リマインダー:

パフォーマンスが必要な場合は、ストリーム リーダーや組み込みの行ベースの読み取りメソッドを使用しないでください。彼らは遅いです。バイナリ バッファを使用して '\n' を検索して行を識別し、(最も望ましいのは) 文字列を作成せずにバッファ内でインプレース解析を行うことです。そうしないと、ガベージ コレクターは満足できません。

于 2013-10-29T05:29:14.990 に答える
2

すべてのインデックス (もちろん PK インデックスを除く) を削除し、インポート後に再構築することもできます。

于 2013-10-28T17:54:36.870 に答える
0

一括挿入を使用できます

mongo Web サイトでドキュメントを読むことができます。また、StackOverflow でこのJava の例を確認することもできます。

于 2014-10-02T20:13:09.207 に答える