Ho un programma che lavora su enormi set di dati. Gli oggetti vengono memorizzati al meglio su contenitori implementati con hash poiché il programma continua a cercare oggetti nel contenitore.Java: HashSet vs. HashMap
La prima idea era utilizzare HashMap poiché i metodi di estrazione e rimozione di questo contenitore sono più adatti agli usi di cui ho bisogno.
Ma, sono venuto a vedere l'uso di HashMap è abbastanza materiale di consumo di memoria, che è un grosso problema, così ho pensato di passare a HashSet sarà migliore perché utilizza solo <E>
, e non <K,V>
per elemento, ma quando ho guardato l'implementazione che ho imparato utilizza una HashMap sottostante! questo significa che non salverà alcun ricordo!
Quindi questo è le mie domande:
- sono tutte le mie ipotesi vero?
- La memoria HashMap è dispendiosa? più specificamente, qual è il suo overhead per ogni voce?
- HashSet è altrettanto dispendioso di HashMap?
Esistono altri contenitori basati su Hash che consumeranno significativamente meno materiali di consumo?
aggiornamento
Come richiesto nei commenti mi estendere un po 'sul mio programma, il HashMap è destinato a contenere un paio di altri oggetti, e alcuni valore numerico - un flottante calcolata da loro. lungo la strada ne estrae alcuni ed entra in nuove coppie. Dato un paio ha bisogno di assicurarsi che non tenga questa coppia o per rimuoverla. La mappatura può essere eseguita utilizzando il valore float o lo hashCode
dell'oggetto pair.
Inoltre quando dico "enormi set di dati" Sto parlando circa ~ 4 * 10^9 oggetti
quali sono le tue ipotesi? – SMA
* che è un grosso problema *: vero? Hai misurato e provato che l'uso di un HashSet nel tuo usecase ha consumato troppa memoria? Qual è il caso d'uso? –
@almasshaikh Le mie ipotesi sono tutte le cose scritte nel mio post e in particolare le domande che seguono ... – petric