2014-04-08 12 views
6

Chcę wyszukiwać masowo dane pogrupowane z wieloma kluczami w najszybszy możliwy sposób. Mam plik z tymi informacjami, ale chcę załadować go do pamięci. Pojemność pamięci nie stanowi problemu.Przeszukuj masywne dane pogrupowane wieloma kluczami C#

key1 | key2 | key3 | key4 | value1 | value2 
-----|------|------|------|--------|-------- 
1 | 1 | 1 | 1 | str | 20 
1 | 1 | 1 | 2 | str | 20 
1 | 1 | 1 | 3 | str | 20 
1 | 1 | 2 | 1 | str | 20 
2 | 1 | 1 | 1 | str | 20 

Mam spojrzał na niektórych kolekcjach ale jestem wciąż niepewny: enter image description here http://blog.bodurov.com/Performance-SortedList-SortedDictionary-Dictionary-Hashtable

Może multiklawiszem słownika będzie lepiej, ponieważ uniknąć a wiele redundancji w kluczach.

public class MultiKeyDictionary<T1, T2, T3> : Dictionary<T1, Dictionary<T2, T3>> 


key1 | key2 | key3 | key4 | value1 | value2 
-----|------|------|------|--------|-------- 
1 | 1 | 1 | 1 | str | 20 
    |  |  | 2 | str | 20 
    |  |  | 3 | str | 20 
    |  | 2 | 1 | str | 20 
2 | 1 | 1 | 1 | str | 20 

Nie będę szukać wszystkich kluczy, ale może 50% z nich. Jestem otwarty na nawet szalone sugestie.

+0

Czy możesz zmaterializować wiele kopii danych niezależnie zoptymalizowanych dla każdego wyszukiwania, które zrobisz? Zindeksowane dla Key1, indeksowane dla key2, etc ... –

+2

Czy możesz dokładniej określić konkretne zapytania, które musisz wykonać w odniesieniu do tych danych? – usr

+0

Mogę podzielić dane za pomocą klawisza od lewej do prawej, ale do klawisza dostępu 2 Najpierw potrzebuję dostępu do klawisza 1. Zatem każdy prawy klawisz znajduje się w zbiorze od lewego klawisza. key4 znajduje się w key3, a key3 in key2 ... – Naster

Odpowiedz

1

Możesz po prostu użyć Tuple swoich kluczy dla klucza słownika i dla wartości.

var bank = new Dictionary<Tuple<int, int, int, int, int>, Tuple<string, int>>(); 

bank.Add(Tuple.Create(k1, k2, k3, k4), Tuple.Create("str", 20)); 
+0

nie, ponieważ jeśli chce, aby znaleźć dopasowania tylko 1 klucz, nie może, jesteś po prostu łącząc wszystkie klucze w jeden klucz, ograniczając go do jednego klucza dla każdego rekordu, co nie jest o to pytaniem. – Eluvatar

+0

@Eluvatar W takim przypadku mógłby użyć słownika > bank i mieć każdy klucz do tej samej wartości Tuple – BenVlodgi

+1

Klawisz1-4 utworzyć pojedynczy klucz. Chcę uniknąć nadmiarowości w kluczach z czymś takim jak Słownik > ... ale wydajność jest kluczowa, więc ... – Naster

Powiązane problemy