5

現在、Javaドライバーを使用して巨大なJSONファイル(〜100 MB)をMongoDBにインポートする作業を行っています。ファイル全体のインポートで最初に問題が発生したため、現在、ファイルを小さなチャンクに分割しています。もちろん、最大ドキュメントサイズが16 MBであるというMongoDBの制限を認識していますが、現在インポートしているチャンクはそれよりはるかに小さいです。

不思議なことに、インポート手順はLinux(Eclipse)で実行すると機能しますが、同じプログラムはWindows(Eclipse)で「何かを言うことができない」という例外をスローします。データベースからログを監視すると、エラーメッセージに次のように表示されます。

> "Thu Sep 13 11:38:48 [conn1] recv(): message len 1835627538 is too
> large1835627538"

同じデータセットでインポートを再実行すると、メッセージの長さに関して常に同じエラーメッセージが表示されます。インポートするドキュメントのサイズを調査しました(.toString()。length()を使用)-エラーの原因となったチャンクはわずか数kBの大きさでした。

mongoデータベースが実行されているOSに違いはありませんが、インポートコードが実行されている場所によって異なります(同じjava-mongo-driverを使用)

4

1 に答える 1

1

「現在、Java ドライバーを使用して巨大な JSON ファイル (~100 MB) を MongoDB にインポートする作業を行っています」

何千もの JSON オブジェクトを含む JSON ファイルについて話しているのでしょうか、それともサイズが ~100MB の 1 つの JSON オブジェクトについて話しているのでしょうか? 私の記憶が正しければ、16MB の制限は、1000 個の JSON オブジェクトを含む JSON ファイルごとではなく、オブジェクトごとであるためです。

また!

"Thu Sep 13 11:38:48 [conn1] recv(): message len 1835627538 is too
large1835627538" 

エラーの原因となったチャンクは、わずか数キロバイトでした。

1835627538 が実際に kb 単位である場合、それはかなり大きいため、約 1750 ギガバイトになります!!

何千もの JSON オブジェクトを含む JSON ファイルを処理するには、データ ファイルを 1 行ずつ反復処理し、そのように挿入してみませんか? 私の方法では、データ ファイルの大きさは関係ありません。反復子は、特定の行への単なるポインターです。ファイル全体をメモリにロードして挿入しません。

注: これは、データ ファイルに 1に 1 つの JSON オブジェクトが含まれていることを前提としています。

Apache Commons IO FileUtils (ここをクリック)を使用すると、Line イテレータを使用してファイルを反復処理できます。たとえば、(完全に機能するコードではなく、正しいライブラリをインポートする必要があります)。

LineIterator line_iter;
    try {
        line_iter = FileUtils.lineIterator(data_file);      
        while (line_iter.hasNext()) {
            line = line_iter.next();

            try {
                    if (line.charAt(0) == '{') 
                            this.mongodb.insert(line);
            } catch (IndexOutOfBoundsException e) {}
            }
        }
        line_iter.close(); // close the iterator  
    } catch (IOException e) {
        e.printStackTrace();
    }
于 2012-09-30T10:13:06.520 に答える