Pergunta

Se eu tiver um imutável Mapa que eu poderia esperar (em um período muito curto de tempo - como alguns segundos) para adicionar/remover centenas de milhares de itens de, é o padrão HashMap Uma má ideia?Digamos que eu queira passar 1 Gb de dados pelo Mapa em <10 segundos, de forma que o tamanho máximo do Mapa a qualquer momento seja de apenas 256 MB.

Tenho a impressão de que o mapa guarda algum tipo de "história", mas vou sempre estar acessando a última tabela atualizada (ou seja,Eu não passo o mapa) porque é uma variável membro privada de um Actor que é atualizado/acessado apenas nas reações.

Basicamente, suspeito que esta estrutura de dados possa ser (parcialmente) culpada para problemas que estou vendo em JVMs ficando sem memória ao ler grandes quantidades de dados em um curto espaço de tempo.

Estaria melhor com uma implementação de mapa diferente e, em caso afirmativo, o que é?

Foi útil?

Solução

Ai.Por que você tem que usar um mapa imutável?Pobre coletor de lixo!Mapas imutáveis ​​​​geralmente exigem (log n) novos objetos por operação, além de (log n) tempo, ou eles realmente apenas agrupam mapas hash mutáveis ​​​​e conjuntos de alterações de camadas na parte superior (o que retarda as coisas e pode aumentar o número de criações de objetos).

A imutabilidade é ótima, mas não me parece o momento de usá-la.Se eu fosse você, ficaria com scala.collection.mutable.HashMap.Se você precisar de acesso simultâneo, envolva o Java util.concurrent.

Você também pode querer aumentar o tamanho da geração mais jovem na JVM: -Xmn1G ou mais (supondo que você esteja executando com -Xmx3G).Além disso, use o coletor de lixo de rendimento (paralelo).

Outras dicas

Isso seria horrível. Você diz que sempre deseja acessar a última tabela atualizada, isso significa que você só precisa de um efêmero estrutura de dados, não há necessidade de pagar o custo de um persistente Estrutura de dados - é como negociar tempo e memória para obter "pontos de estilo" completamente discutíveis. Tu es não Construindo seu karma usando estruturas cegamente persistentes quando não forem solicitadas.

Além disso, uma hashtable é uma estrutura particularmente difícil de tornar persistente. Em outras palavras, "muito, muito lento" (basicamente é utilizável quando as leituras superam muito o número de gravações - e você parece falar sobre muitas gravações).

A propósito, um ConcurrentHashMap Não faria sentido nesse design, já que o mapa é acessado de um único ator (é o que eu entendo da descrição).

O chamado mapa imutável da Scala é quebrado além do uso básico até Scala 2.7. Não confie em mim, basta procurar o número de ingressos abertos para isso. E a solução é apenas "será substituída por outra coisa no Scala 2.8" (o que fez).

Então, se você deseja um mapa imutável para Scala 2.7.x, eu aconselho procurá -lo em algo diferente de Scala. Ou apenas use o TreeHashmap.

(*) O mapa imutável de Scala não é realmente imutável. É uma estrutura de dados mutável internamente, que requer muita sincronização.

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