2

テキストファイル(各行は1つのcsvのようなエントリ)から1億のエントリをRavenDBデータベースにインポートしたいと思います。これを行うための最速の方法は何ですか?

その他の注意事項:

まだインデックスを持っていません(データを挿入してから作成します)。RavenDBは、セキュリティが強化されていないローカルマシンでサービスモードで実行されています(ただし、まだRavenDBをテストしているため)。このテストは、2つの異なるマシンで実行されます。1)2コア4GB RAM 2)8コア12GBRAM。

このデータの一部(200万エントリ)をRavenDBに挿入しましたが、思ったほど速くはありませんでした。OpenAsyncSessionを使用し、1024レコードごとにSaveChangesAsyncを呼び出し、OpenAsyncSessionを呼び出して、500`000エントリ程度の後にタスク(SaveChangesAsyncによって返される)が返されるのを待たずに新しいセッションを再度作成すると、「インデックスが範囲外」という例外が発生します。根絶することはできません。しかし、タスクが終了するのを待つと(コアの数と同じ数のタスクを作成することで)、プロセスは成功しますが、十分な速度ではありません。

このコードは正常に実行されました。

using (var reader = new StreamReader(@"D:\*\DATA.TXT", Encoding.UTF8))
{
    string line = null;
    IAsyncDocumentSession session = null;

    var tasks = new List<Task>();
    var locCount = 0;

    while ((line = reader.ReadLine()) != null)
    {
        if (string.IsNullOrWhiteSpace(line)) continue;

        var loc = Parse(line);

        if (session == null) session = documentStore.OpenAsyncSession();

        session.Store(loc);
        locCount++;

        if (locCount % 1024 == 0 && session != null)
        {
            try
            {
                var t = session.SaveChangesAsync();
                tasks.Add(t);
                session = null;
            }
            catch (Exception x)
            {
                // ... something ...
            }
        }

        if (tasks.Count >= NUMBER_OF_CORES)
        {
            Task.WaitAll(tasks.ToArray());
            tasks.Clear();
        }
    }

    if (session != null)
    {
        if (tasks.Count > 0)
        {
            Task.WaitAll(tasks.ToArray());
            tasks.Clear();
        }
        session.SaveChangesAsync().Wait();
        session = null;
    }
}

ありがとう

4

1 に答える 1

5

カベ、

ここには多くの問題があります。

1)RavenDBモデルがCSVファイルにマップされることはめったにありません。CSVファイルがある場合、通常は表形式であり、RavenDBに移植するのに適した形式ではありません。良いモデルを入手することで、おそらくより良い結果を得ることができます。

2)を使用せずにコーディングするとif (tasks.Count >= NUMBER_OF_CORES)、可能な限り多くのタスクが生成されます(ファイルからの行の読み取りの制限がありますが、これは非常に高速です。これにより、数千の同時タスクが生成される傾向があり、リクエストの数が過負荷になりますRavenDB一度に挿入できます。

3)標準セッションを使用し、バッチサイズ1,024〜2,048を使用します。そして、それを実行させてください。RavenDBは最適化に非常に優れており、1秒あたり数千の挿入が簡単に表示されると思います。

しかし、繰り返しになりますが、あなたはおそらく物事を間違ってモデル化しています。

于 2012-06-25T07:40:35.570 に答える