Problema ao ter de inspecionar grande quantidade de arquivos criados em diretório

Java

Engenharia de Software

29/07/2015

Boa noite, estou implementando uma classe que deve inspecionar um diretório x que "aleatoriamente" ira receber pequenos (porem muitos) arquivos txt que posteriormente serão processados...Para isso utilizei a classe WatchService e já consigo detectar a entrada de arquivos no diretório, pegar cada um desses arquivos e ordenar dentro de um array...

Porém existe uma preocupação quanto a performance, nesse cenário é possível que ao mandar popular esse array "arquivos = diretorio.listFiles" existam muitos arquivos no diretório sendo scaneado, muitos mesmo, na casa de milhões por exemplo, podendo assim estourar a memória etc. Alguem ai teria alguma sugestão de como trabalhar em cima desse problema ?
Bruno Santana

Bruno Santana

Curtidas 0

Melhor post

Ronaldo Lanhellas

Ronaldo Lanhellas

03/08/2015

Boa noite, estou implementando uma classe que deve inspecionar um diretório x que "aleatoriamente" ira receber pequenos (porem muitos) arquivos txt que posteriormente serão processados...Para isso utilizei a classe WatchService e já consigo detectar a entrada de arquivos no diretório, pegar cada um desses arquivos e ordenar dentro de um array...

Porém existe uma preocupação quanto a performance, nesse cenário é possível que ao mandar popular esse array "arquivos = diretorio.listFiles" existam muitos arquivos no diretório sendo scaneado, muitos mesmo, na casa de milhões por exemplo, podendo assim estourar a memória etc. Alguem ai teria alguma sugestão de como trabalhar em cima desse problema ?


Eu sou apto a trabalhar com a ideia de "blocagem". Blocagem é uma tecnica de dividir para conquistar, ou seja, você quebra seu problema em problemas menores. O que eu fari ano seu caso ?

1) Se a velocidade do processamento não for importante, você pode trabalhar apenas com 1 Thread caso contrário o ideal seria criar várias Threads para processar os arquivos de forma concorrente.
2) Com a ideia da BLOCAGEM você parametriza quantos arquivos devem ser processados por vez, ex: 500 a cada leitura. Assim, toda vez que a leitura desses 500 terminar você pega mais 500 e assim por diante. Carregar 1 milhão de uma vez só com certeza vai lhe trazer um "stackoverflow".

Um exemplo simples de blocagem:

public void init(){
  int blockSize = 500;
  File[] filesToReady = getFiles(blockSize);
  for(File f : filesToReady){
      //faça seu processamento aqui
   }
 marcarComoLido(filesToReady);
  
}

public File[] getFiles(int quantidade){
   //retorna uma quantidade de arquivos especificada
}

public void marcarComoLido(File[] files){
  //pode mudar o nome do arquivos adicionando uma palavra-chave que identifique que ele já foi lido ou mesmo mudar ele de diretorio
}
GOSTEI 1

Mais Respostas

Bruno Santana

Bruno Santana

29/07/2015

Opa, muito interessante Ronaldo...

Muito obrigado pela resposta! Sempre salvando!!!
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

29/07/2015

Disponha, boa sorte.
GOSTEI 0
Roniere Almeida

Roniere Almeida

29/07/2015

Bruno, sua duvida foi totalmente esclarecida, se sim, posso finalizar o post?
GOSTEI 0
Bruno Santana

Bruno Santana

29/07/2015

Sim, pode finalizar... valeu
GOSTEI 0
POSTAR