оптимизация буста неупорядоченной карты и наборов, C ++ - PullRequest
4 голосов
/ 19 мая 2009

Я буду разбирать 60 ГБ текста и много вставлять и искать в картах. Я только начал использовать boost :: unordered_set и boost :: unordered_map Когда моя программа начинает заполнять эти контейнеры, они становятся все больше и больше, и мне стало интересно, будет ли хорошей идеей предварительно выделить память для этих контейнеров. что-то вроде MyMap :: get_allocator () выделяют (N).

или я должен просто оставить их, чтобы они сами определяли и определяли факторы роста? коды выглядят так

boost::unordered_map <string,long> words_vs_frequency, wordpair_vs_frequency;   
boost::unordered_map <string,float> word_vs_probability, wordpair_vs_probability,
           wordpair_vs_MI;                  
//... ... ...                                   

N = words_vs_frequency.size();
long   y =0; float MIWij =0.0f, maxMI=-999999.0f;
for (boost::unordered_map <string,long>::iterator i=wordpair_vs_frequency.begin(); 
                     i!=wordpair_vs_frequency.end(); ++i){
if (i->second >= BIGRAM_OCCURANCE_THRESHOLD)
    {
    y++;
    Wij = i->first;
    WordPairToWords(Wij, Wi,Wj);
    MIWij =  log ( wordpair_vs_probability[Wij] /
             (word_vs_probability[Wi] * word_vs_probability[Wj]) 
            );

    // keeping only the pairs which MI value greater than 
    if (MIWij > MUTUAL_INFORMATION_THRESHOLD)
        wordpair_vs_MI[ Wij ] = MIWij;
    if(MIWij > maxMI )
        maxMI = MIWij; 
    }

   }

Заранее спасибо

Ответы [ 3 ]

11 голосов
/ 19 мая 2009

Согласно документации , оба unordered_set и unordered_map имеют метод

void rehash(size_type n);

, который регенерирует хеш-таблицу так, чтобы она содержала как минимум n сегментов. (Похоже, он делает то, что reserve() делает для контейнеров STL).

4 голосов
/ 19 мая 2009

Я бы попробовал это обоими способами, что позволит вам генерировать точные данные, показывающие, работает ли один метод лучше, чем другой. Мы можем целый день рассуждать о том, какой метод будет оптимальным, но, как и в большинстве вопросов о производительности, лучше всего попробовать его и посмотреть, что произойдет (а затем исправить детали, которые действительно нуждаются в исправлении).

При этом авторы Boost кажутся очень умными, поэтому вполне возможно, что они будут работать как есть. Вам просто нужно проверить и посмотреть.

0 голосов
/ 19 мая 2009

Честно говоря, я думаю, вам лучше написать свой собственный распределитель. Например, вы можете создать распределитель с помощью метода preallocate(int N), который зарезервирует N байт, а затем использовать unordered_map::get_allocator() для вашего удовольствия. Кроме того, с помощью своего собственного распределителя вы можете указывать ему захватывать огромные куски за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...