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)
