[Problema] Ler arquivo txt grande - Falta de espaço na Heap

3 respostas
F

Olá pessoal,

Estou com um problema para ler um arquivo txt que possui entre 256MB e 2GB, o programa em si é muito simples apenas preciso ler um arquivo que guarda o comportamento de algumas threads e ver se o log está correto, porem quando o arquivo passa de poucos mb o programa lança uma exceção de falta de espaço na heap, vi outros topicos de usuarios com este mesmo problema, mas não encontrei a solução, tbm vi que eu poderia usar java.nio, mas não sei como eu pegaria uma linha por vez neste caso.

Segue uma parte do codigo, o erro ocorre no leitor.readLine().

readerfile = new FileReader("teste.txt");
        leitor = new BufferedReader(readerfile);


        System.out.println("Analise 1/4 - Threads de Insercao mutuamente exclusivas.");

        String linha = null;
        aprov = false;
        fimwhile = true;

        while ((linha = new String(leitor.readLine())) != null) {
            if (linha.equals("Realizando Insercao")) {
                if (aprov == false) {
                    aprov = true;
                } else {
                    aprov = false;
                    fimwhile = false;
                    break;
                }
            }
            else if (linha.equals("Insercao Finalizada")) {
                if (aprov == true) {
                    aprov = false;
                } else {
                    aprov = false;
                    fimwhile = false;
                    break;
                }
            }
        }

3 Respostas

E

Troque

while ((linha = new String(leitor.readLine())) != null) {

por

while ((linha = leitor.readLine()) != null) {

O que ocorre agora?

Marky.Vasconcelos

Teoricamente fazer:

while ((linha = new String(leitor.readLine())) != null) {

Pode ocupar mais memoria que apenas.

while ((linha = leitor.readLine()) != null) {

Pois voce pode aproveitar o pool de strings para as iguais, que pelo se percebe no seu código pode repetir bastante.

Mas não sei como o FileReader carrega isso então não posso te afirmar. Vale o teste.

thiagocg

Uma sugestão seria vc trocar a instanciação de objetos strings dentro do seu loop, usando no lugar um unico objeto stringbuilder e limpando ele a cada final do loop, pois vc esta atribuindo uma nova instancia a sua string “linha”, e a anterior ficaria no buffer como ja citado, agora como não podemos prever o funcionamento do CG talves esta troca de string por stringbuilder possa amenizar o consumo de memoria.

Segundo o if else poderia ser substituido por uma instrução switch case parametrizada com enuns, no seu caso vc mostrou duas opções “Realizando Insercao” e “Insercao Finalizada”, vc poderia criar um enum com eles e outros “valores de teste if” que vc tiver, isto tb reduziria o seu processamento.

Espero te ajudado!

[]'s

Criado 7 de junho de 2010
Ultima resposta 7 de jun. de 2010
Respostas 3
Participantes 4