È necessario capire come funziona un dizionario. Un dizionario contiene un elenco di "bucket hash" in cui vengono posizionati gli elementi che inserisci. Questo è un numero finito, quindi una volta che lo hai riempito devi allocare più secchi, non c'è modo di aggirarlo. Poiché l'assegnazione degli oggetti ai bucket si basa sul risultato di una funzione hash, non è possibile semplicemente aggiungere i bucket alla fine dell'array e inserire elementi, è necessario riassegnare l'intero elenco di blocchi, ripeti tutto e mettilo nei (nuovi) secchi corrispondenti.
Dato questo comportamento, l'unico modo per rendere il dizionario non riassegnare una volta pieno è assicurarsi che non si riempia mai. Se conosci il numero di elementi che inserirai nel dizionario, passalo come parametro al costruttore e sarai fatto, non più riallocazioni del dizionario.
Se non riesci a farlo (non sai il numero di elementi che avrai nel dizionario) dovrai riconsiderare ciò che ti ha fatto scegliere lo TDictionary
in primo luogo e selezionare una struttura dati che offre un compromesso migliore per il tuo particolare algoritmo. Ad esempio, è possibile utilizzare gli alberi di ricerca binari, poiché eseguono il bilanciamento ruotando le informazioni nei nodi esistenti, senza necessità di riassegnazioni mai.
fonte
2011-12-02 12:52:30
Penso che l'ipotesi di base sia che non si consumi la metà delle risorse disponibili in una singola istanza "TDictionary". Non è progettato per tale utilizzo. –
Quindi questo sarebbe un "no, non è possibile"? – jpfollenius
Una volta che hai consumato metà della memoria, come fai a ridistribuire. Supponiamo di voler aggiungere un altro 10%. Devi assegnare un nuovo blocco, il 10% più grande di quello esistente. Quindi copia dal vecchio al nuovo. Quindi rilasciare vecchio. Non funzionerà. Mi sembra strano che un singolo contenitore possa consumare più della metà delle tue risorse. –