Boa tarde;
Preciso ler 80000 linhas em um txt, e armazenar em um objeto para cada linha.
Está dando estouro de memoria …
Leitura de arquivo txt com 80.000 linhas (registros) criando objetos para cada linha
28 Respostas
Como vc esta rodando esta classe ? Tem um método main ? Qual a configuração de memória da sua JVM ?
Main
Qto a configuração da memoria…
Se vc esta rodando direto pelo eclipse é preciso ir em Run >> Run Configurations >> achar a sua classe e depois adicionar as seguintes linhas dentro do VM Arguments
-Xmx1024m -Xms512m
Com isso vc diz para a sau JVM quanto de memória ela poderá usar…se não me engano por padrão a JVM usa apenas 64m (não me lembro)
Agora se vc executa pela linha de comando (no DOS por exemplo) teria q usar:
java -Xms256m -Xmx1000m suaClasse
entendeu !?!?!?
Com certeza, entendi…
Vou configurar…
Qto ao armazenamento de 100 em 100, torna-se necessário???
Estou rodando no Eclipse…
Com certeza, entendi…
Vou configurar…
Qto ao armazenamento de 100 em 100, torna-se necessário???
Olha eu estou trabalhando com um arquivo, neste exato momento, com 214.000 linhas e com umas 700 colunas em média para cada linha.
Usando os argumentos de memória não precisei ficar quebrando o processo em vários pedaços…acredito que vc tb não precise.
Configurei, vou testar…
No meu TCC eu tive que criar algo parecido. Eu precisava transformar varias partidas de xadrez em formato png texto em objetos java.
Eu tive que criar 100 mil objetos, sendo que cada objeto tinha uma árvore interna de outros objetos que referenciavam as objetos jogadas daquela partida.
O problema dessa modelagem consiste que o processamento e o tempo gasto no load das partidas era considerável.
Para resolver esse problema, que está parecendo um pouco com o seu, eu simplesmente Serializei todos os objetos Java e salvei em disco, e quando
era preciso eu simplesmente deserializava toda a estrutura. Com isso o tempo gasto em carregar todos os objetos Java diminuiu consideravelmente.
Tente serializar seus 80 mil objetos e salvar em disco e quando for necessário deserializa, assim você economiza tempo e processamento.
Claro que considerando que seu arquivo texto não muda frequentemente.
As validações que ocorrem são tantas que demora cerca de uma hora para validar tudo…está na 1300 …
Ainda nao deu estouro…
Como serializo??? Tem exemplo utilizado???
nossa… mesmo com inumeras validações nao era pra demorar tanto assim… 1000 linhas por hora Oo
que validações está fazendo? ta fazendo do melhor jeito possivel? ta ignorando outras validações qndo a primeira ja da erro? se o problema está nas validações serializar nao vai mudar muito nao…
Um exemplo bem simples:
http://www.devmedia.com.br/post-3050-Introducao-a-serializacao-de-objetos.html
Isso é apenas uma sugestão, mas se acaso você não conseguir construir e serializar
os 80 mil objetos de uma vez, tente apenas pegar um conjunto desses 80 mil, carregar e
salvar em disco e assim até terminar todos os objetos.
Uso validadores
Esta muito lenta…3000 agora…duas a cada segundo…
Como podem observar devo gerar dois xml’s com corretos e errados…
Cara, certa vez eu precisei retirar informações de arquivos de texto( milhares deles) em lote, estava demorando demais, pois a operação consistia em abrir o arquivo, retirar todos os caracteres e obter as informações necessárias.
Para melhorar o desempenho, eu coloquei toda a operação de extração e filtro dentro de um método static, a performance ficou 200% melhor.
Utilizei o JDom…
Funcionou perfeitamente…
Utilizei o JDom…
Funcionou perfeitamente…Como faço para atualizar um nó especifico de um cpf, que está no xml com JDom???
Obrigado pelas ajudas, foram de grande valia…
Para trabalhar internamente com XML, você pode usar as linguagens XQuery e XPath.
Se fosse no SQL Server, iria conseguir lhe ajudar a atualizar um nó específico usando modify.
Tem alguma outra forma???
Você consegue trabalhar com os métodos getChildren, getChildrenText e outros métodos de acesso a tags e conteúdo do XML.
Porém, para persistir uma alteração no XML, você terá de salva-lo novamente em disco.
Para gerar o XML de saída, vou lhe dar uma sugestão.
Conhece JAXB? Em três linhas você gera um XML de saída e trabalha com objetos JAVA, somente com get e setters.
Ou seja, cria uma classe que contenha uma lista de objetos, a classe principal é o “Root” do seu XML e a classe que será adicionada a lista são as tags que se repetem.
Basta usar os annotations do JAXB e ser feliz.
Edit: só para ficar claro, quando me refiro aos gets e setters, são das classes que representam o XML de saída. Para criar o XML em disco, ai vai usar método como marshal e unmarshal
Abraços.
Tente fazer desta forma pra ver se resolve:
- Leia todo o arquivo (popule uma Collection com todas os objetos que representam a lina);
- Feche o arquivo;
- Itere na collection e faça as validações;
Este é o xml para os erros.
Estou usando o JDOM.
<?xml version="1.0" encoding="UTF-8" ?>
-
Preciso excluir o nó pelo num_inscricao e inserir em outro xml.
Primeiro passo, como excluo?
Este é o xml para os erros.
Estou usando o JDOM.<?xml version="1.0" encoding="UTF-8" ?> - <RegistrosErrados> - <Candidato num_inscricao="[telefone removido]"> <cpf>370x62458</cpf> <dig_cpf>67</dig_cpf> <rg>[telefone removido]</rg> <dig_rg>X</dig_rg> </Candidato> <Candidato num_inscricao="[telefone removido]"> <cpf>000x62458</cpf> <dig_cpf>50</dig_cpf> <rg>[telefone removido]</rg> <dig_rg>7</dig_rg> </Candidato> </RegistrosErrados>Preciso excluir o nó pelo num_inscricao e inserir em outro xml.
Primeiro passo, como excluo?
Só não posso deixar de comentar novamente que na minha humilde opinião, o JAXB é muito mais simples e fácil.
Para a sua pergunta, use o método do JDom e remova a tag.
Algo como: element.removeChild(oldChild);. O parametro oldChild é um objeto do tip Node.
Para gerar o XML atualizado, precisa usar o Documento no qual está trabalhando e a partir dele gerar o novo XML em disco.
Abraços.
Obrigado pela dica. Caso queira utilizar o JAXB, teria que mudar muito do codigo??
Acompanhou o inicio do desenvolvimento???
Obrigado pela dica. Caso queira utilizar o JAXB, teria que mudar muito do codigo??
Acompanhou o inicio do desenvolvimento???
Não. Basta criar uma classe com o annotation @XmlRootElement no inicio de sua classe e declarar cada atributo da mesma com o nome que quer gerar a tag xml.
Se preferir, podes usar a tag @XmlElement.
Exemplo:
@XmlRootElement(name = "NomeDaTagRootDoXml")
public class SuaClasse {}
Para que a tag não exista, basta fazer com o que um atributo de sua classe seja null e ela não será gerada.
Eu li e entendi que precisas gerar dois xml de saída, creio que seja mais fácil e prático que JDOM.
Mas fica a teu critério.
Abraços.
Valeu, vou pesquisar sobre o JAXB e tentar implementar…
Abraços…
sobre configurar a memória… o ideal seria criar um ShellScript para chamar o programa com as configurações que você julgar necessárias.
se for ruindows… crie uma bat.
Bom dia…
Consegui utilizar o JAXB…