Sto riscontrando difficoltà nel memorizzare centinaia di milioni di coppie chiave/valore di 16/32byte con un array hash sul mio SSD.Cabinet Kyoto/Berkeley DB: Limiti di dimensione tabella hash
Con cabinet Kyoto: Quando funziona correttamente, inserisce a 70000 record/s. Una volta che scende, scende a 10-500 record/s. Con le impostazioni predefinite, la caduta avviene dopo circa un milione di record. Guardando la documentazione, questo è il numero predefinito di bucket nell'array, quindi ha senso. Ho aumentato questo numero a 25 milioni e, di fatto, funziona fino a circa 25 milioni di record. Il problema è che, non appena spingo il numero di bucket a 30 milioni o più, la frequenza di inserimento è ridotta a 10-500 record/s dall'inizio. Kyoto Cabinet non è progettato per aumentare il numero di bucket dopo la creazione del database, quindi non posso inserire più di 25 milioni di record.
1/Perché la frequenza di inserimento di KC diventa molto bassa una volta che il numero della benna supera 25 M?
Con Berkeley DB: la velocità migliore che ho avuto è leggermente inferiore rispetto KC, più vicino a 50000 di registrazione/s, ma ancora ok. Con le impostazioni predefinite, proprio come KC, la velocità diminuisce improvvisamente dopo circa un milione di record. So che BDB è progettato per estendere gradualmente il suo numero di secchi. Indipendentemente da ciò, ha cercato di aumentare il numero iniziale, giocando con HashNumElements e FillFactor, ma nessuno di questi tentativi ha peggiorato la situazione. Quindi non riesco ancora a inserire oltre 1-2 milioni di record con DBD. Ho provato ad attivare transazioni non sincronizzate, ho provato diversi tassi di checkpoint, aumentato il numero di cache. Niente migliora la discesa.
2/Cosa potrebbe causare la caduta della frequenza di inserimento di BDB dopo 1-2 milioni di inserti?
Nota: Sto lavorando con Java, e quando la velocità è in calo, l'utilizzo della CPU abbassa al 0-30%, mentre al 100% quando si lavora a velocità corretta.
Nota: Arrestare il processo e riprendere l'inserimento non cambia nulla. Quindi non penso che sia legato ai limiti di memoria o alla garbage collection.
Thx.
Che aspetto ha l'ambiente BDB? stai usando transazioni, repliche, ecc.? Inoltre, puoi pubblicare qualche codice di esempio? –
Lo stato corrente è: [pastebin.com/bWJpbipZ](http://pastebin.com/bWJpbipZ). Inserisco con 'database.put (transaction, k, v)', letto con 'database.get (transazione, k, v, LockMode.DEFAULT)', e checkpoint ogni 500000 inserti con 'environment.checkpoint (null)'. –