2013-02-18 21 views
12

Pracuję nad strukturą danych, gdzie wejście jest bardzo duże prawie 1 TB. Potrzebuję załadować dane do pojemnika asocjacyjnego.map vs multimap w C++ (wydajność)

Dane mają zduplikowane wejścia, więc używam multimapy, ale ktoś zaproponował mi użycie mapy wektorowej zamiast tego. Czy mogę wiedzieć, jaka jest różnica w wydajności?

map<const char*, const char*, cmptr> mulmap; 

map <const char*, vector <const char*> ,cmptr> mmap; 
+5

Dlaczego nie spróbujesz ich obu i się dowiesz? –

+7

W obu przypadkach wydajność prawdopodobnie zostanie zdominowana przez prędkość dysku, chyba że masz system z 1 TB pamięci RAM ... –

+1

Jeśli chcesz używać 'const char *' jako klucza, musisz również podać predykat porównania aby to działało. Łatwiej byłoby użyć 'std :: map '. –

Odpowiedz

17

tracisz czasu na myślenie o map kontra multimap. Załóżmy, że liczba pojemników wynosi N, a średnia liczba pozycji na bin wynosi M.

Zazwyczaj używa się drzewa RB z duplikatami kluczy.

  • Pobiera O (log n + log M)
  • Insert O (log n + log M)
  • Usuwanie O (log n + log M)
  • iteracji O (1)

A std::map<Key, std::vector<Val>> zazwyczaj używa drzewa RB z unikatowymi kluczami.

  • Fetch jest O (log N)
  • Insert jest O (log N)
  • Delete wynosi O (log N)
  • Iteracja jest O (1)

jak ty widać, różnica nie jest warta mówienia, chyba że M jest bardzo duże.

Jednak pamięć obu jest ograniczona przez pamięć RAM. 1 TB jest po prostu niewykonalne w przypadku większości systemów i żadna płyta główna, o której słyszałem, nie obsługuje tej technologii.

Lepiej korzystaj z bazy danych dla 1 TB danych. Możesz wybrać prawie dowolną bazę danych dla tego zadania. Kyoto Cabinet jest prosty i robi to, co chcesz, ale możesz również użyć PostgreSQL, MySQL, Sqlite, Dynamo, Redis, MongoDB, Cassandra, Voldemort ...

+2

W przypadku "1 TB danych", należy zachować ostrożność w odniesieniu do bazy danych i sposobu dane są dostępne .. są ograniczenia i takie. –

+1

Pracuję na super komputerze. – Manish

+2

@ user15662: Wciąż polecam Kyoto Cabinet nad 'std ::' cokolwiek dla tego rodzaju pracy. –

5

Z 1 TB danych wejściowych, nie użyłbym ani. Najprawdopodobniej nie masz wystarczającej ilości pamięci RAM. Użyj niektórych na strukturze danych na dysku, takich jak B-tree.