Olá pessoal, tenho um arquivo XML de 200 mb, que tenho abrir e realizar alguns filtros para selecionar somente alguns dados que interessem, eu já consegui ler o arquivo com o xStream. E agora preciso fornecer o acesso a estes dados, mas não quero salvar em banco, pois este xml muda constantemente, e o objetivo é somente carrega-lo e consulta-lo. Qual seria a melhor forma de fazer isso, pensei em salvar os dados em arquivo binario e consulta-los a partir deste arquivo, mas não sei se é a melhor alternativa em questão de desempenho, portanto gostaria de algumas sugestões.
[RESOLVIDO]Qual tipo de arquivo que conseguimos maior performance de leitura em aplicação Java
10 Respostas
Depende. Seus dados sao sempre “de leitura”? (ou seja, você le o XML e cria um arquivo que serve apenas para ser consultado?)
Se todos os dados filtrados cabem na memoria, você pode ser preguiçoso e usar um ObjectOutputStream / ObjectInputStream - você serializa os dados que foram filtrados em uma única estrutura na memória, e então você lê a estrutura toda de uma vez.
O problema é que o filtro será feito depois de os dados estarem disponíveis ao usuário, eu teria que ter um table com todos os dados e alguns inputs que seriam informados os valores, a medida que os valores fossem informados os dados seriam filtrados, semelhante a uma aplicação com banco. E estes dados serão usados exclusivamente para leitura e no máximo para uma exportação dos dados filtrados.
Supondo que você tenha 1 milhão de registros, você poderia exibir os 100 ou 1000 primeiros registros, assim o usuário iria informar o filtro desejado… aí sim você iria aplicar o filtro nesses registros exibidos e buscar o restante com o filtro informado.
Não sei, só uma idéia
Tudo certo com a sua dica Lucas, mas onde buscar estes dados? Eu usaria o ObjectOutputStream / ObjectInputStream sugerido pelo entanglement? Esta é a melhor forma? Meu arquivo XML tem 200 mb no formato original, se transformado em arquivo texto fica com aproximadamente 150 mil linhas, posso jogar todas estas linhas em um ObjectOutputStream e depois, vou conseguir percorre-lo e filtra-lo? Se eu transformar estes dados em arquivo binário terei maior performance?
Pera aí. O arquivo que você quer criar já contém os dados filtrados (e nesse caso um simples ObjectInput/OutputStream já resolveria seu problema, já que você procuraria os dados somente em memória), ou você quer simplesmente pegar o XML original e convertê-lo em um formato (como um banco de dados não-relacional, por exemplo) que seja rápido de consultar?
Se o arquivo que você quer consultar não está filtrado (ou seja, é uma representação alternativa do XML), pode escolher um banco de dados não-relacional (se o XML tiver uma estrutura muito complexa) ou então um banco de dados relacional (se ele puder ser mapeado para uma ou mais tabelas de um banco de dados).
É isso ai, meu xml tem os dados brutos que devem ser filtrados depois de armazenados em algum arquivo ou banco. Não consigo filtrar no XML porque ele é muito grande e leva um tempo considerável para percorre-lo, então como usarei os dados apenas para consulta, estou procurando a melhor forma de manter estes dados do XML em termos de velocidade de pesquisa. E estes dados ficaram disponíveis por no máximo um mês, que é o tempo em que recebo novo XML.
A melhor opção é usar um banco embutido como o HSQL. Se os dados são read only tanto melhor. O HSQL até suporta CSV se quiser mudar do xml.
Outra opção é usa XSLT para fazer o filtro via mecanismos do xml sem carrega na memoria. Depois vc carrega apenas que o XSLT retornou. Se não quiser usar XSLT tb tem a opção do XPath que é como um SQL para XML e funciona direto do arquivo sem ter que carregar na memoria. Vc só precisaria converter o que o filtro do XPath encontrar. Pense como se fosse um dao acessando SQL. Só que é um dao acessando XML , usando XPath. O Xpath tem todas as funções normais do SQL , contains, like, etc… até somas.
Eu importaria esse xml em um banco de dados e depois continuava a brincadeira de exibir e filtrar
Obrigado a todas pelas dicas. Sergio vou pesquisar o HSQL e o XPath, e depois retorno qual utilizei e o porque, mesmo assim, muito obrigado.
Finalizando o tópico, no meu caso o XPath se mostrou melhor porque meu arquivo XML tem um tamanho razoável e realizar os filtros sem precisar carregar o arquivo aumentou bastante o desempenho, pois só carrego o que preciso conforme o Sérgio falou, se fosse utilizar o HSQL que também é interessante, pelo menos uma vez eu teria que carregar todos os dados. Valeu pessoal e mais uma vez obrigado.