質問
私はかなり長い間、私たちのプロジェクトのいくつかに良いNOSQLデータベースを探していましたが、最近、.NETサポートの観点から非常に素晴らしいように見えるRavendbを発見したので、試して少しベンチマークを書くことにしました。ビジネスの最初の注文は、次のコードを使用して、挿入速度をテストしていました。
class Program
{
private const int TEST_COUNT = 10000;
static void Main(string[] args)
{
var store = new DocumentStore();
store.Url = "http://localhost:8117";
store.Initialize();
var timer = Stopwatch.StartNew();
var session = store.OpenSession();
for (var i = 0; i < TEST_COUNT; i++)
{
session.Store(new TestEntity()
{
Name = "Test Entity"
});
if (i % 127 == 0)
{
session.SaveChanges();
session.Dispose();
session = store.OpenSession();
}
}
session.SaveChanges();
session.Dispose();
timer.Stop();
Console.WriteLine("Processed {0:n0} records", TEST_COUNT);
Console.WriteLine("Time elapsed: {0:n0} ms", timer.ElapsedMilliseconds);
Console.WriteLine("Records / sec: {0:n0}", TEST_COUNT / (timer.ElapsedMilliseconds / 1000d));
}
}
class TestEntity
{
public string Name { get; set; }
public DateTime Created { get; set; }
public TestEntity()
{
Created = DateTime.UtcNow;
}
}
出力は次のとおりです。
Processed 10,000 records
Time elapsed: 9,531 ms
Records / sec: 1,049
Press any key to continue . . .
これは比較的高速なマシン(3GHz、2GB RAMを実行しているWindows7)上にあります
私をクレイジーと呼んでください。しかし、特にわずか2つのフィールドを含むドキュメントの場合、1000個の挿入 /秒が恐ろしく遅いです。これは予想されますか? Ravendbは書面ではなく読み取り用に最適化されていることを知っていますが、これはかなり悪いことです。
解決
「書くのではなく、読み取りに最適化されている」全体のために、それよりもはるかに速くなるかどうかはわかりません。
しかし、あなたが読み通すなら このスレッド いくつかの提案があります:
- バッチアップは書き込み(あなたがやっていること)。あなたが閉じてからセッションを再開する必要があるかどうかはわかりませんが、あなたはただ電話できるはずです
SaveChanges()
- トランザクションモードを怠zyに設定します(
Raven/TransactionMode
) - 輸入を非同期に行います。つまり、いくつかのスレッドから
あなたが試すことができるもう一つのことはです embedded mode
, 、つまり、セッションを変更します
var documentStore = new DocumentStore { DataDirectory = "path/to/database/directory" };
documentStore.Initialize();
これにより、HTTPトラフィックをバイパスし、ドキュメントを直接挿入します。 ドキュメント 詳細については。
所属していません StackOverflow