2015-11-18 21 views
5

Stiamo usando un MultiMap per una rapida ricerche valore/indice, dichiarato come questochiamando .clear() o .Elimina() in C++ std :: multimap a volte causa di congelamento (100% CPU)

typedef double Numerical; 
std::multimap<Numerical, Int32> SortableRowIndex; 

E lo riempiamo a coppie, utilizzando

SortableRowIndex.insert(std::pair<Numerical, Int32>(GetSortable(i), i)); 

La funzione GetSortable() restituisce sempre un doppio. E questo funziona bene. Anche l'iterazione dei valori funziona bene. Ma poi viene la parte strana ... a volte quando cerchiamo di cancellare i dati ...

SortableRowIndex.clear(); 

... si va in una sorta di loop e bancarelle/gare, monopolizzavano il nucleo utilizzata della CPU a 100%.

Il metodo chiaro sembra essere ereditato da XTree (file system) e ci sono solo un coupld di righe al suo interno:

void clear() _NOEXCEPT 
     { // erase all 
#if _ITERATOR_DEBUG_LEVEL == 2 
     this->_Orphan_ptr(*this, 0); 
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */ 

     _Erase(_Root()); 
     _Root() = this->_Myhead; 
     _Lmost() = this->_Myhead; 
     _Rmost() = this->_Myhead; 
     this->_Mysize = 0; 
     } 

Per qualche ragione, il mio Visual Studio 2013 non mi lascia un passo in questo metodo durante il debug ... e non posso, per la vita di me capire quale sia il problema!

Qualsiasi aiuto sarà ridicolmente apprezzato!

+2

Ci sono dei NaN nell'ingresso? –

+2

questo http://stackoverflow.com/questions/8096817/is-nan-a-valid-key-value-for-associative-containers può essere correlato – Slava

+0

Cercando di capire cosa intendi ... input to where? –

risposta

3

Come risulta, non è realmente in fase di stallo, ma la cancellazione di una multimap tramite il debugger di Visual Studio è REALMENTE LENTA. Ho notato che la memoria veniva rilasciata slegata e lasciata funzionare per un paio di minuti e poi è stata finalmente completata. Eseguendo l'applicazione all'esterno di Visual Studio, le chiamate .clear() scendevano a < 1s, anche per milioni di coppie.

Quindi, testa a testa se si stanno eliminando enormi multimap durante l'esecuzione in modalità di debug in Visual Studio. È sloooooow.

+0

La modalità di rilascio in anticipo è altrettanto lenta se la si avvia tramite il debugger di Visual Studio. –

+0

Ancora vero nel caso ve lo stiate chiedendo. – Carbon