2013-04-01 3 views
0

У меня есть база данных (RavenDB), которая должна обрабатывать 300 запросов (полнотекстовый поиск) каждые 10 секунд. Для того, чтобы увеличить себе свободу я дробится базу данных так, у меня есть несколько documentStores мой код:C# RavenDB embedded optimize

  var watch = Stopwatch.StartNew(); 
     int taskcnt = 0; 
     int sum = 0; 


     for (int i = 0; i < 11; i++) 
     { 
      Parallel.For(0, 7, new Action<int>((x) => 
      { 
       for(int docomentStore = 0;docomentStore < 5; docomentStore++) 
       { 
        var stopWatch = Stopwatch.StartNew(); 
        Task<IList<eBayItem>> task = new Task<IList<eBayItem>>(Database.ExecuteQuery, new Filter() 
        { 
         Store = "test" + docomentStore, 
         MaxPrice = 600, 
         MinPrice = 200, 
         BIN = true, 
         Keywords = new List<string>() { "Canon", "MP", "Black" }, 
         ExcludedKeywords = new List<string>() { "G1", "T3" } 
        }); 
        task.ContinueWith((list) => { 
         stopWatch.Stop(); 
         sum += stopWatch.Elapsed.Milliseconds; 
         taskcnt++; 
         if (taskcnt == 300) 
         { 
          watch.Stop(); 
          Console.WriteLine("Average time: " + (sum/(float)300).ToString()); 
          Console.WriteLine("Total time: " + watch.Elapsed.ToString() + "ms"); 

         } 

        }); 
        task.Start(); 
       } 

      })); 
      Thread.Sleep(1000); 

     } 
  • Среднее время запроса: 514,13 мс
  • Общее время: 00: 01: 29,9108016

код, где я запрашиваю ravenDB:

 public static IList<eBayItem> ExecuteQuery(object Filter) 
    { 
     IList<eBayItem> items; 
     Filter filter = (Filter)Filter; 

     if (int.Parse(filter.Store.ToCharArray().Last().ToString()) > 4) 
     { 
      Console.WriteLine(filter.Store); return null; 
     } 
     using (var session = Shards[filter.Store].OpenSession()) 
     { 
      var query = session.Query<eBayItem, eBayItemIndexer>().Where(y => y.Price <= filter.MaxPrice && y.Price >= filter.MinPrice); 

      query = filter.Keywords.ToArray() 
      .Aggregate(query, (q, term) => 
       q.Search(xx => xx.Title, term, options: SearchOptions.And)); 
      if (filter.ExcludedKeywords.Count > 0) 
      { 
       query = filter.ExcludedKeywords.ToArray().Aggregate(query, (q, exterm) => 
       q.Search(it => it.Title, exterm, options: SearchOptions.Not)); 
      } 
      items = query.ToList<eBayItem>(); 
     } 
     return items; 
    } 

И инициализацию RavenDB:

 static Dictionary<string, EmbeddableDocumentStore> Shards = new Dictionary<string, EmbeddableDocumentStore>(); 
    public static void Connect() 
    { 
     Shards.Add("test0", new EmbeddableDocumentStore() { DataDirectory = "test.db" }); 
     Shards.Add("test1", new EmbeddableDocumentStore() { DataDirectory = "test1.db" }); 
     Shards.Add("test2", new EmbeddableDocumentStore() { DataDirectory = "test2.db" }); 
     Shards.Add("test3", new EmbeddableDocumentStore() { DataDirectory = "test3.db" }); 
     Shards.Add("test4", new EmbeddableDocumentStore() { DataDirectory = "test4.db" }); 
     foreach (string key in Shards.Keys) 
     { 
      EmbeddableDocumentStore store = Shards[key]; 
      store.Initialize(); 
      IndexCreation.CreateIndexes(typeof(eBayItemIndexer).Assembly, store); 
     } 
    } 

Как я могу оптимизировать свой код, чтобы общее время было ниже? Хорошо ли разделить мою базу данных на 5 разных?

EDIT: Программа имеет только 1 documentStore вместо 5. (Как мотивационные по Ayende Rahien) Кроме того, это является запрос по себе:

Price_Range:[* TO Dx600] AND Price_Range:[Dx200 TO NULL] AND Title:(Canon) AND Title:(MP) AND Title:(Black) -Title:(G1) -Title:(T3) 

ответ

2

Нет, это не хорошо. Используйте один встроенный RavenDB. Если вам нужно ошпаривание, это связано с несколькими машинами.

В общем, запросы RavenDB находятся в нескольких мс каждый. Вам нужно показать, как выглядят ваши запросы (вы можете вызвать ToString() на них, чтобы увидеть это).

Имея Осколки RavenDB таким образом, означает, что все они борются за CPU и IO

+0

Price_Range: [* TO Dx600] AND Price_Range: [Dx200 TO NULL] AND Title: (Canon) AND Title: (MP) AND Title: (Black) -Title : (G1) -Title: (T3) Это мой запрос. – Svexo

Смежные вопросы