Pergunta

Preciso de uma estrutura de mapa suportada por disco para usar em um aplicativo Java.Deve ter os seguintes critérios:

  1. Capaz de armazenar milhões de registros (até bilhões)
  2. Pesquisa rápida - a maioria das operações no Mapa será simplesmente para ver se já existe uma chave.Este e o item 1 acima são os critérios mais importantes.Deve haver um mecanismo eficaz de cache de memória para chaves usadas com frequência.
  3. Persistente, mas não precisa ser transacional, pode conviver com alguma falha.ou sejafica feliz em sincronizar com o disco periodicamente e não precisa ser transacional.
  4. Capaz de armazenar tipos primitivos simples - mas não preciso armazenar objetos serializados.
  5. Não precisa ser distribuído, ou seja,funcionará tudo em uma máquina.
  6. Simples de configurar e gratuito para usar.
  7. Não são necessárias consultas relacionais

As chaves dos registros serão strings ou longs.Conforme descrito acima, as leituras serão muito mais frequentes do que as gravações, e a maioria das leituras será simplesmente para verificar se existe uma chave (ou seja,não precisará ler os dados associados às chaves).Cada registro será atualizado apenas uma vez e os registros não serão excluídos.

Atualmente uso o Bdb JE, mas estou procurando outras opções.


Atualizar

Desde então, melhorei o desempenho da consulta na minha configuração existente do BDB, reduzindo a dependência de chaves secundárias.Algumas consultas exigiam uma junção de duas chaves secundárias e, ao combiná-las em uma chave composta, removi um nível de indireção na pesquisa que agiliza muito as coisas.

Foi útil?

Solução

Eu provavelmente usaria um banco de dados local.Como dizer Bdb JE ou HSQLDB.Posso perguntar o que há de errado com essa abordagem?Você deve ter algum motivo para procurar alternativas.

Em resposta aos comentários:Quanto ao problema de desempenho e acho que você já está usando JDBC para lidar com isso, pode valer a pena tentar o HSQLB e ler o capítulo sobre Uso de memória e disco.

Outras dicas

JDBM3 faz exatamente o que você está procurando.É uma biblioteca de mapas baseados em disco com API realmente simples e alto desempenho.

ATUALIZAR

Este projeto agora evoluiu para MapDB http://www.mapdb.org

Você pode querer investigar OrientDB.

Você pode experimentar o Java Chronicles em http://openhft.net/products/chronicle-map/Chronicle Map é um armazenamento de dados persistente de alto desempenho, fora do heap, de valor-chave e na memória.Funciona como um mapa java padrão

A partir de hoje eu usaria MapDB (sincronização com base/suporte de arquivo ou assíncrona) ou Hazelcast.Posteriormente, você terá que implementar sua própria persistência, ou seja,apoiado por um RDBMS implementando uma interface Java. OpenHFT crônica pode ser uma outra opção.Não tenho certeza de como a persistência funciona lá, já que nunca a usei, mas afirmo ter uma.OpenHFT está completamente fora do heap e permite atualizações parciais de objetos (de primitivos) sem (des) serialização, o que pode ser um benefício de desempenho.

OBSERVAÇÃO:Se você precisar do seu disco de mapa devido a problemas de memória, a opção mais fácil é MapDB.Hazelcast pode ser usado como um cache (distribuído ou não) que permite remover elementos do heap após tempo ou tamanho.OpenHFT está fora do heap e pode ser considerado se você precisar apenas de persistência para reinicializações de jvm.

encontrei Gabinete de Tóquio ser um Hash/Mapa simples e persistente e rápido de configurar e usar.

Este exemplo abreviado, retirado de os documentos, mostra como é simples salvar e recuperar dados de um mapa persistente:

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();

SQLite faz isso.Eu escrevi um wrapper para usá-lo em Java: http://zentus.com/sqlitejdbc

Como mencionei em um comentário, usei SQLite com sucesso com gigabytes de dados e tabelas de centenas de milhões de linhas.Se você pensar bem na indexação, é muito rápido.

A única dor é a interface JDBC.Comparado a um HashMap simples, é desajeitado.Muitas vezes acabo escrevendo um wrapper JDBC para o projeto específico, o que pode resultar em muito código clichê.

Cache JBoss (árvore) é uma ótima opção.Você pode usá-lo de forma independente no JBoss.Muito robusto, de alto desempenho e flexível.

Eu penso Fragmentos de hibernação pode facilmente atender a todos os seus requisitos.

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