ما هو مستوى الأداء الذي يجب أن أتوقعه من RavendB؟
-
02-10-2019 - |
سؤال
لقد كنت أبحث عن قاعدة بيانات جيدة لـ NOSQL لبعض مشاريعنا لبعض الوقت واكتشفت مؤخرًا Ravendb والتي تبدو رائعة جدًا من منظور دعم .NET ، لذلك قررت أن أجربها وكتابة معيار صغير. كان الترتيب الأول للأعمال هو اختبار سرعة إدراج ، باستخدام الكود التالي:
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 . . .
هذا على جهاز سريع نسبيًا (3 جيجا هرتز ، ذاكرة الوصول العشوائي 2 جيجا بايت تعمل بنظام التشغيل Windows 7)
اتصل بي بالجنون ، لكن 1000 إدراج / ثانية بطيئة بشكل فظيع ، خاصة بالنسبة للوثائق التي تحتوي على حقلين فقط. هل هذا متوقع؟ أعلم أن Ravendb تم تحسينه للقراءات ، وليس يكتب ، لكن هذا أمر سيء للغاية.
المحلول
لا أعرف ما إذا كنت ستحصل على أسرع بكثير من ذلك بسبب كل شيء "محسّن للقراءات ، ولا تكتب".
ولكن إذا قرأت من خلال هذا الموضوع هناك بعض الاقتراحات:
- يكتب دفعة (وهو ما تفعله). لست متأكدًا من أنك بحاجة إلى الإغلاق ثم إعادة فتح الجلسة ، يجب أن تكون قادرًا على الاتصال
SaveChanges()
- اضبط وضع المعاملة على كسول (
Raven/TransactionMode
) - قم بالواردات بشكل غير متزامن ، أي من عدة خيوط
شيء آخر يمكنك تجربته هو embedded mode
, ، أي تغيير جلستك إلى
var documentStore = new DocumentStore { DataDirectory = "path/to/database/directory" };
documentStore.Initialize();
هذا يتجاوز حركة مرور HTTP ويدرج المستندات مباشرة ، انظر المستندات لمزيد من المعلومات.