Pergunta

Eu trabalho em aplicação java web. Em algum ponto eu uso muito grande variável árvore que salvar e persistem na memória (RAM). i pode migrar isso para memória virtual (swap). nota: árvore enorme consistem nome e e-mail para todos os utilizadores que o uso de sugestão Ajax caixa de texto.

Foi útil?

Solução

Não há uma maneira padrão no Linux de forçar um bloco de memória de swap, assim a JVM não terá uma forma de pedir o sistema operacional para executar tal tarefa.

O melhor que você pode fazer se você quiser essa funcionalidade, é serializar a árvore e escrever os dados brutos para um arquivo em disco, em seguida, trazê-lo de volta quando você está pronto para isso.

Mas você provavelmente não quer isso, porque escrever para um disco é extremamente lento quando comparado à memória física i / o.

O caso em questão, vamos a preocupação OS sobre isso. É seguro assumir que sabe uma maneira melhor de gerenciar a memória do que você.

Outras dicas

Deixe o OS o usuário está usando cuidar disso.

Uma imagem java em execução que parcialmente páginas fora de swap é uma imagem java morto. Assim que um GC bastante ansiosos entra em ação, você começa a página tudo de volta. A página no é ruim o suficiente. Se você realmente não tem memória RAM suficiente para a coisa toda, você acaba com uma surra, destruição sem resposta de um servidor. Paginada Java é Bad (tm).

Se você tiver RAM suficiente para toda a coisa, você não precisa de swap.

Material sua lista para uma tabela de banco de dados, no disco, indexá-lo, limitar os seus conjuntos de resultados, e fazer as consultas adequadas contra ela. Vai ser uma vitória líquida, eo DB pode armazenar em cache as páginas que mais gosta, então você não tem que pensar sobre isso.

Ou obter mais RAM.

O sistema operacional gerencia automaticamente sua própria memória e empurra as coisas para o arquivo de swap, conforme necessário.

Se você tem um monte de dados, você pode querer considerar armazenar seus dados em um banco de dados em vez de uma árvore enorme na memória. Este seria provavelmente permitir que sua escala de aplicação melhor, e ele também pode melhorar o desempenho -. Seria certamente dar-lhe um melhor desempenho do que ler e escrever toda a estrutura para o disco sempre que você precisa olhar para cima ou para modificar um registro

Edit: Você não necessariamente tem que configurar uma máquina de banco de dados dedicado. Tendo em conta que você está tentando atualmente para armazenar todos os seus dados na memória agora, você provavelmente pode usar um banco de dados embutido como HSQLDB SQLite , que possuem limites de tamanho de 16 GB e 2Tb, respectivamente.

Eu acho interessante que todo mundo está dizendo que o armazenamento de itens no disco é terrivelmente terrivelmente terminais ineficientes, e ao mesmo tempo recomending ele usar um banco de dados, provavelmente um remoto que vai armazenar dados no disco .. em outra máquina ..

Você está assumindo que o sistema será mais eficiente ao manusear cegamente o arquivo de swap do que seria ter o arquivo de swap influenciado pelo código que sabe o que o futuro reserva. é muito mais eficiente para trocar memória que você sabe que não vai ser usado por um tempo do que é para o sistema de olhar para todos os itens na memória e tentar colocar de forma eficiente alguns dos que nesse arquivo.

É claro que ao ser errado você é tudo um pouco certo .. um banco de dados local seria a forma mais eficiente de armazenar dados em um arquivo (onde será escrito e lido). Se você não tem acesso a um banco de dados local, em seguida, um código. A hashmap é projetado para ser armazenado na memória e uma lista ligada indexados ordenado é projetado para ser armazenado em disco. Tentando empurrar diretamente da memória para o disco sem alguma consideração para a eficiência de ambos os meios não é eficaz.

Que tal isso como uma posição diferente sobre o mesmo problema: Eu estou criando um monte de server-side PDFs, eu tenho 10 de de 1000, de clientes que geralmente deseja executar relatórios ao mesmo período do mês. tamanho médio PDF pode ser 7-10Mb. Com uma pilha finitos disponíveis, 'trocar' os dados para um arquivo temporário é uma forma válida para criar os PDFs desde que eu preciso ser capaz de definir o conteúdo de comprimento sobre a resposta antes da transmissão dos dados de PDF para o cliente.

Talvez em vez de apenas questionando a concepção algumas opções úteis pode ser útil. Pessoalmente, eu estou olhando usando um arquivo temporário por processo ou acesso simultâneo de um único arquivo 'troca'.

O que você sugere?

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