テキストファイル(各行は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;
}
}
ありがとう