У меня есть огромное количество (1500 миллионов) пар Integer, где каждый из них связан с идентификатором документа. Теперь моя цель - поиск документов, имеющих одну пару.Память эффективная карта <пара <int,int>, комплект <int>> альтернативный
Моя первая идея состояла в том, чтобы использовать хэш-карту (std::map
) с использованием значений пары в качестве ключей и документов идентификаторов в качестве ассоциированных значений, т.е. map<pair<int,int>, unordered_set<int>>
Например:
Document1
- pair1: (3, 9)
- pair2: (5,13)
Document2
- pair1: (4234, 13)
- pair2: (5,13)
map<pair<int,int>, unordered_set<int>> hashMap
hashMap[{3, 9}].insert(1)
hashMap[{5, 13}].insert(1)
hashMap[{4234, 13}].insert(2)
hashMap[{5, 13}].insert(2)
приведет в
Key(3,9) = Documents(1)
Key(5,13) = Documents(1,2)
Key(4234,13) = Documents(2)
Моя проблема в том, что это занимает огромное количество памяти, которая превышает мою доступную 24 ГБ ОЗУ. Поэтому мне нужна альтернатива с хорошей производительностью для вставок и поисковых запросов, которые могут вписаться в мою память. В теории я использую 1500 Million * 3 (PairVal1, PairVal2, Document-ID) * 4 (bytes per Integer) = 18GB
, когда накладные расходы не учитываются. Итак, есть ли хорошие альтернативы для моей проблемы?
std :: map нет хеш-карты, вы можете захотеть std :: unordered_map –
Я не могу говорить об эффективности, но вы можете посмотреть на stxxl для этого типа проблем. Http: // stxxl.sourceforge.net/ – Dan
Если количество документов в 'set' является небольшим, вы можете заменить его на' std :: vector' – Galik