Pergunta

Java tem (ou existe uma biblioteca disponível) que me permite ter um disco baseado HashMap?Ele não precisa ser atômica ou qualquer coisa, mas ele será acessado através de várias linhas e não deve falhar se os dois estão acessando o mesmo elemento ao mesmo tempo.

Alguém sabe de alguma coisa?

Foi útil?

Solução

Qualquer arquivos de propriedades ou Berkeley DB Pode ser o que você está procurando. o java.util.Properties em si implementa java.util.Map e fornece métodos para load de e store para um arquivo. O banco de dados de Berkeley é frequentemente recomendado como um armazenamento leve de pares de valor-chave.

Outras dicas

Mapdb

O MAPDB fornece Treemap e hashmap simultâneos apoiados por armazenamento em disco ou memória fora da heap. É um mecanismo de banco de dados Java INCORDIDE RÁPIDO, ESCALÁVEL e FÁCIL DE USO. É embalado com recursos como transações, serialização com eficiência de espaço, cache de instância e compactação/criptografia transparente. Ele também tem um excelente desempenho rivalizado apenas por motores de banco de dados nativos incorporados.

http://www.mapdb.org/

JDBM2

Banco de dados Java do valor da chave incorporado.

https://code.google.com/p/jdbm2/

Parece que você precisa de algo próximo a um db leve. Você já olhou/considerado Java DB? Um db leve com uma tabela única e indexada seria basicamente um mapa de hash com fios e seguros de threads.

JDBM2 é exatamente o que você está perguntando. Ele fornece um backup de hashmap por armazenamento em disco (entre outros mapas). É rápido, seguro para roscas e a API é realmente simples.

Projeto Voldemort também é um "hashmap" muito rápido/escalável/replicação ". É usado no LinkedIn, um desempenho também é muito bom:

Uma citação do site:

Aqui está a taxa de transferência que vemos de um único cliente multithread conversando com um único servidor onde o conjunto de dados "Hot" está na memória sob carga artificial em nosso Laboratório de Performance:

Leia: 19.384 Req/s
Escreve: 16.559 req/s

Mapa da crônica implementos ConcurrentMap e persiste dados no disco através do mapeamento de sua memória para um arquivo.

O mapa do Chronicle é conceitualmente muito semelhante ao MAPDB (fornece API de construtor semelhante e Map interface), mas o mapa da crônica é vezes mais rápido do que o MapDB e possui uma simultaneidade muito melhor (o Chronicle Map usa bloqueios de spin altamente listrados de vários níveis).

Então o ano é agora 2016. E se alguém quer resolver esse problema, descobri que a API de ambientes de baixo nível em da JetBrains funciona para esse mesmo objetivo, usando seus computeInTransaction Armazene Lambdas.

Concedido, não é tão liso quanto ter um puro Map exemplo, mas funcionou para o meu caso de uso.

Outra opção recente é usar H2's MVStore motor de armazenamento O que faz a mesma coisa, mas acho que é mais adaptada ao próprio banco de dados.

Felicidades!

No 2018 o mais leve persistente key value loja é o H2 Banco de dados com MVStore:

O MVStore é persistente, registo estruturado de armazenamento de chave-valor.É planejado para ser o próximo subsistema de armazenamento de H2, mas também pode ser usado diretamente de dentro de uma aplicação, sem a utilização de JDBC ou SQL.

  • MVStore significa "multi-armazenamento de versão".

  • Cada arquivo contém um número de mapas que podem ser acessados usando o java.util.Interface de mapa.

  • Ambos com base em arquivo de persistência e de operação de memória são suportadas.

  • Destina-se a ser rápido, simples e pequeno.

  • Simultâneas operações de leitura e gravação são suportados.

  • As transações são suportadas (incluindo transações simultâneas e 2-phase commit).

  • A ferramenta é muito modular.Ele suporta pluggable tipos de dados e serialização, conectável de armazenamento (para um arquivo, para fora do heap de memória), conectável mapa implementações (B-tree, R-tree, simultâneas B-árvore atualmente), o armazenamento de BLOB e um arquivo de abstração de sistema para suporte e arquivos criptografados arquivos zip.

H2 também está contido em uma única biblioteca de 1.8 meg

Eu olhei também:

  • MapDB (13 meg dependências)
  • crônica-mapa (5.5 meg dependências - rápido, opcionalmente, distribuídos)
  • lmdbjava (2 meg java dependências + lmdb Biblioteca C) - a mais rápida implementação, mas não thread safe fora da caixa.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top