Ottimizzazione delle prestazioni Java HashMap / alternativa

Voglio creare una HashMap di grandi dimensioni ma le prestazioni put() non sono abbastanza buone. Qualche idea?

Altri suggerimenti sulla struttura dei dati sono benvenuti, ma ho bisogno della funzione di ricerca di una mappa Java:

map.get(key)

Nel mio caso voglio creare una mappa con 26 milioni di voci. Usando lo standard Java HashMap, la velocità di inserimento diventa insopportabilmente lenta dopo 2-3 milioni di inserimenti.

Inoltre, qualcuno sa se usare diverse distribuzioni di codici hash per le chiavi potrebbe aiutare?

Il mio metodo di hashcode:

 byte[] a = new byte[2]; byte[] b = new byte[3]; ... public int hashCode() { int hash = 503; hash = hash * 5381 + (a[0] + a[1]); hash = hash * 5381 + (b[0] + b[1] + b[2]); return hash; } 

Sto usando la proprietà associativa di addition per garantire che gli oggetti uguali abbiano lo stesso hashcode. Gli array sono byte con valori compresi nell’intervallo 0 – 51. I valori vengono utilizzati una sola volta in entrambi gli array. Gli oggetti sono uguali se gli array contengono gli stessi valori (in entrambi gli ordini) e lo stesso vale per l’array b. Quindi a = {0,1} b = {45,12,33} e a = {1,0} b = {33,45,12} sono uguali.

EDIT, alcune note:

  • Alcune persone hanno criticato l’uso di una mappa di hash o di un’altra struttura di dati per archiviare 26 milioni di voci. Non riesco a capire perché questo sembrerebbe strano. Mi sembra un classico problema di strutture e algoritmi di dati. Ho 26 milioni di articoli e voglio essere in grado di inserirli rapidamente e visualizzarli da una struttura di dati: datemi la struttura dei dati e gli algoritmi.

  • L’impostazione della capacità iniziale della Java HashMap predefinita a 26 milioni riduce le prestazioni.

  • Alcune persone hanno suggerito l’uso di database, in alcune altre situazioni che è sicuramente l’opzione intelligente. Ma sto davvero chiedendo una struttura di dati e problemi di algoritmi, un database completo sarebbe eccessivo e molto più lento di una buona soluzione di datastructure (dopo tutto il database è solo software ma avrebbe comunicazione e forse overhead del disco).