[RESOLVIDO]Erro java.lang.OutOFMemoryError

1 resposta
D

Olá a todos

Dessa vez eu estou forçando a barra com meu código. Tenho um ArrayList que deve receber todo o conteúdo de um arquivo .txt, de modo que cada linha do arquivo é um item do ArrayList. Após preencher este ArrayList vou procurar algumas strings em cada uma destas linhas. Se eu encontrar algumas destas strings que procuro vou guardar a linha em que a string foi encontrada para eu poder ler toda a linha depois (isso é outra história heheh)

A questão é que a quantidade de linhas é um pouco grande (heheheh). Só 300 mil linhas. Digo pouco grande porque eu queria guardar cerca de uns 10 milhoes de linhas pou mais, ou talvez até não ter restrição de quantidade, o que seria melhor ainda.

O erro OutOfMemoryError acontece e é acusado na linha de código onde estou preenchendo o ArrayList e daí todo o resto do meu código nem é executado. Alguém tem uma sugestão?

Eu pensei em talvez realizar a leitura de cada linha e procurar a string nela, daí ler a proxima linha e procurar também até encontrar o final do arquivo, ou seja, ler e comparar, ler e comparar, …, ao invez de ler tudo até o final e compara do começo do array até o final do array. O que acham? Eu não acho que seria muito bom, e nem sei se funcionaria. O que acham?

Segue o código para vocês olharem.

Grato por sugestões!!!

public void searchCommonStrs(){
        ArrayList logRegsArray = new ArrayList(); //registros do log
        ArrayList patternAtksArray = new ArrayList(); //registros padrão da classe

        allRegs = "";
        String comparePatterns = null;
        String compareRegs = null;

        try{

            scsLineReader = new BufferedReader(new FileReader("C:/log.txt"));
            String s;
            
            patternAtksArray = StrAtaques.array; //preenche com os padrões de ataque
            
            while ((s = scsLineReader.readLine()) != null){
                 ogRegsArray.add(s); //preenche com os dados do log  //ERRO AQUI---ESSA É A LINHA 116 DO ERRO NO CONSOLE E A LINHA 72 É A CHAMADA MÉTODO QUE VOCÊ ESTÁ LENDO E QUE FICA EM ALGUM LUGAR LÁ EM CIMA
                //System.out.println(s);	//exibe o conteúdo do log no console do eclipse
            }
            
            for (int i = 0; i < patternAtksArray.size(); i++){
                comparePatterns = (String) patternAtksArray.get(i);
                p = Pattern.compile(comparePatterns);
                //System.out.println("padrao sendo procurado : " +padroes);
                for (int j = 0; j < logRegsArray.size(); j++){
                    compareRegs = (String) logRegsArray.get(j);
                    m = p.matcher(compareRegs);
                    //System.out.println("linha sendo analisada : " +registros+ " | e padrão : " +padroes);
                    
                    while(m.find()){
                    	//System.out.println("registro encontrado " +padroes+ " na posicao: " +m.start());
                        allRegs = allRegs + compareRegs + "\n";
                        System.out.println("tamanho de allRegs > " +allRegs.length());
                        System.out.println("conteudo de allRegs > " +allRegs);
                    }
                }
            }     
            
            allRegs += searchBOverflowOnLog();
            allRegs += searchUnknownExtensions();
            
            scsLineReader.close();
            
            if(allRegs.length() < 1) {//se não existe caracteres na string <dispose>
                System.out.println("nao houve ameaça detectada!!!!!");
                dispose();
            } 
  
        } catch (FileNotFoundException fnfe){
            fnfe.printStackTrace();
            System.out.println("Não foi possível a leitura do arquivo em regexMethod");
            //System.out.println("regex fnfe");
        } catch (IOException ioe){
            ioe.printStackTrace();
            System.out.println("Excessão I/O origem regexMethod");
            //System.out.println("regex ioe");
        } finally {
            //liberando todos os recursos utilizados
            argIP += "\n" + allRegs;
            System.out.println("tamanho de argIP > " +argIP.length());
            System.out.println("conteudo de artIP > " +argIP);
            logRegsArray = null;
            patternAtksArray = null;
            isRemote = true;
            scsLineReader = null;
            bolLineReader = null;
            strToToken = null;
	        unknownEvent = null;
	        token = null;
            temp = null;
            comparePatterns = null;
            compareRegs = null;
            p = null;
            m = null;
            allRegs = null;
        }
        
        try {
            this.dispatch(new URL("atp://127.0.0.1")); //IP da máquina origem -
            // 192.168.0.2
        } catch (RequestRefusedException rre) {
            rre.printStackTrace();
            System.out.println("Solicitação de dispatch causou uma excessão");
        } catch (MalformedURLException mue) {
            mue.printStackTrace();
            System.out.println("Argumento URL no método dispatch está incorreto");
        } catch (IOException ioe) {
            ioe.printStackTrace();
            System.out.println("Excessão de I/O referente ao dispatch");
        }
    }

e o erro no console é o seguinte

Exception in thread "No.3]" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOfRange(Arrays.java:3209)
        at java.lang.String.<init>(String.java:216)
        at java.io.BufferedReader.readLine(BufferedReader.java:331)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at tgiAglets.RemoteAgent.searchCommonStrs(RemoteAgent.java:116)
        at tgiAglets.RemoteAgent$1.onArrival(RemoteAgent.java:72)
        at com.ibm.aglet.Aglet.processMobilityEvent(Unknown Source)
        at com.ibm.aglet.Aglet.dispatchEvent(Unknown Source)
        at com.ibm.aglets.LocalAgletRef.dispatchEvent(Unknown Source)
        at com.ibm.aglets.EventMessage.handle(Unknown Source)
        at com.ibm.aglets.AgletThread.run(Unknown Source)

1 Resposta

D

:idea:Olá novamente. Dessa vez para pedir desculpa por colocar um erro tão bobo. Sabe o que é, acho que foi algum neuronio loiro que comandava o teclaro quando eu digitei o código deste post. Era exatamente a idéia que eu falei antes: não era necessário guardar todo o arquivo em um ArrayList para deeepoooois procurar algo nele. Resolvi o problema lendo uma linha por vez e fazendo a busca nesta linha imediatamente e se nada for achado ela é descartada então leio a proxima linha. Se algo for achado toda a linha é então gravada. Sem contar que agora ficou infinitamente mais rápido!!!

Agora sim é só encontrar um arquivo de log com alguns terabytes de tamanho e alguns milhares de linhas para eu brincar. Será que alguém tem um ai?

Bom, pelo menos este post serviu pra quem também tiver um neuronio loiro. Não pratique programação XP com ele!!! rsrsrsrs

Ah lembrando… com isso resolvido terminei todo o código do meu tgi (ou tcc). Acabei o texto também hoje então é só alegria!!! Aproveito também para agradecer todos os que de alguma maneira me ajudaram nas minhas dúvidas quando estava fazendo o meu código. :smiley:

valeu

Criado 10 de outubro de 2009
Ultima resposta 10 de out. de 2009
Respostas 1
Participantes 1