Pergunta

Eu preciso para serializar uma enorme quantidade de dados (cerca de 2gigs) de pequenos objetos em um único arquivo, a fim de serem processados ??mais tarde por outro processo Java. O desempenho é tipo de importante. Alguém pode sugerir um bom método para conseguir isso?

Foi útil?

Solução

Você deu uma olhada em google do buffers de protocolo ? Soa como um caso de uso para ele.

Outras dicas

Eu não sei por quê Java serialização tem votado para baixo, é um mecanismo perfeitamente viável.

Não está claro a partir do post original, mas é tudo 2G de dados na pilha ao mesmo tempo? Ou despejo outra coisa?

Fora da caixa, serialização não é a solução "perfeita", mas se você implementar Externalizable em seus objetos, serialização pode funcionar muito bem. Serializações grande despesa é descobrir o que escrever e como escrevê-lo. Ao implementar Externalizable, você toma essas decisões fora de suas mãos, ganhando assim um grande impulso no desempenho e uma economia de espaço.

Enquanto I / O é um custo primário de escrever grandes quantidades de dados, os custos incidentais de converter os dados podem também ser muito caro. Por exemplo, você não deseja converter todos os seus números ao texto e, em seguida, de volta, melhor para armazená-los em um formato mais natural, se possível. ObjectStream tem métodos para ler / escrever os tipos nativos em Java.

Se todos os seus dados é projetado para ser carregado em uma única estrutura, você poderia simplesmente fazer ObjectOutputStream.writeObject (yourBigDatastructure), depois de ter implementado Externalizable.

No entanto, você também pode iterar sobre sua estrutura e writeObject chamada em objetos individuais.

De qualquer maneira, você vai precisar de alguma rotina "objectToFile", talvez várias. E isso é efetivamente o que Externalizable fornece, bem como um quadro de andar de sua estrutura.

A outra questão, claro, é de versão, etc. Mas desde que você implementar todas as rotinas de serialização você mesmo, você tem total controle sobre isso também.

Uma simples abordagem que vem imediatamente à minha mente está usando tampão de memória mapeada de NIO (java.nio.MappedByteBuffer). Usar o tampão único (aproximadamente) que corresponde ao tamanho de um objecto e rubor / adicione-os para o ficheiro de saída quando necessário. buffers mapeados na memória são muito effecient.

Você já tentou java serialização? Você poderia escrevê-los usando um ObjectOutputStream e ler 'em volta usando um ObjectInputStream . Claro que as classes teria que ser Serializable . Seria a solução de baixo esforço e, porque os objetos são armazenados em binário, que seria compacto e rápido.

Se o desempenho é muito importação, então você precisa escrevê-lo eu. Você deve usar um formato binário compacto. Porque com 2 GB a operação de disco de I / O são muito importantes. Se você usar qualquer formato legível humana como XML ou outros scripts que você redimensionar os dados com um fator de 2 ou mais.

Dependendo dos dados que pode ser a velocidade até se você comprimir os dados em tempo real com uma taxa de compressão baixa.

Um total não ir é a serialização Java, porque a leitura de verificação Java em cada objeto se ele é uma referência a um objeto existente.

I desenvolveu JOAFIP como alternativa banco de dados.

Apache Avro pode ser também usefull. Ele foi projetado para ser independente linguagem e tem ligações para as linguagens populares .

Confira.

buffers de protocolo: faz sentido. aqui está um trecho de seu wiki: http://code.google.com/apis /protocolbuffers/docs/javatutorial.html

Obter Mais velocidade

Por defeito, o protocolo de tampão tentativas compilador para gerar arquivos menores usando reflexão para implementar a funcionalidade mais (por exemplo, a análise e a serialização). No entanto, o compilador também pode gerar código otimizado explicitamente para seus tipos de mensagens, muitas vezes fornecendo uma ordem de aumento de desempenho magnitude, mas também dobrando o tamanho do código. Se profiling mostra que a sua aplicação está gastando muito tempo na biblioteca buffer de protocolo, você deve tentar alterar o modo de otimização. Basta adicionar a seguinte linha ao seu arquivo .proto:

opção optimize_for = velocidade;

Re-executar o compilador de protocolo, e ele irá gerar extremamente rápida análise, serialização e outro código.

Você provavelmente deve considerar uma solução de banco de dados - todos os bancos fazer é otimizar suas informações, e se você usar o Hibernate, você manter o seu modelo de objeto como está e realmente não sequer pensar em seu DB (eu acredito que é por isso que ele é chamado hibernate, apenas armazenar seus dados off, em seguida, trazê-lo de volta)

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