Pergunta

Estou procurando uma estrutura de hash persistente em Java, uma loja de valor-chave simples, onde a chave é uma string e o valor exclusivo é um int. O valor de uma chave é ser incrementado sempre que uma chave existente é adicionada à loja.

Eu preciso que isso seja bastante grande - possivelmente 500m - 1 bilhão de teclas. Eu tenho avaliado Tokyo-Cabinet http://fallabs.com/tokyocabinet/javadoc/ Mas não tenho certeza de quão bem ele escalará - os tempos de inserção parecem estar ficando mais longos à medida que o hash cresce.

Alguma idéia do que pode ser apropriado?

Obrigado

Editar: Para reduzir a E/S do disco, vou armazenar dados em cache em um hash de memória e atualizar o hash persistente de uma só vez quando o cache crescer para um determinado tamanho.

Edit2: Uma das razões para a persistência é que eu tenho RAM limitada, 4 GB, por isso não consigo encaixar um grande suporte na memória.

Foi útil?

Solução

I Thing megamap é o que você está procurando: http://megamap.sourceforge.net/. Aqui está uma breve descrição do Megamap de sua página inicial:

O Megamap é uma implementação Java de um mapa (ou hashtable) que pode armazenar uma quantidade ilimitada de dados, limitada apenas pela quantidade de espaço em disco disponível. Os objetos armazenados no mapa são persistidos no disco. O bom desempenho é alcançado por um cache na memória. O Megamap pode, por todos os motivos práticos, ser considerado uma implementação de mapa com espaço de armazenamento ilimitado.

Outras dicas

Use um banco de dados não um hash. Mesmo para um banco de dados, 500m linhas estão ficando bastante grandes. Quantas atualizações você espera por segundo?

Você já conferiu o Berkeley BD Java Edition? Eles TEM um API compatível com coleções (Veja também o Javadoc para StoredMap).

Então, se eu entendi corretamente, Redis pode ser uma opção. Você pode emitir comandos incr [chave] para incrementar atomicamente o valor associado a essa chave. Se a chave não existir, é definido como zero e depois incrementado (resultando em um). De acordo com documentos, Incr é uma operação em tempo constante. A velocidade é uma meta de design primário para Redis.

Redis é capaz de se persistir em arquivar e você pode controlar os parâmetros sobre como isso acontece.

Eu penso Memcached é uma boa opção para o seu caso, juntamente com um banco de dados adequado no back -end.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top