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

29/07/2015

0

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

Responder

Post mais votado

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
}

Ronaldo Lanhellas

Ronaldo Lanhellas
Responder

Mais Posts

05/08/2015

Bruno Santana

Opa, muito interessante Ronaldo...

Muito obrigado pela resposta! Sempre salvando!!!
Responder

06/08/2015

Ronaldo Lanhellas

Disponha, boa sorte.
Responder

06/08/2015

Roniere Almeida

Bruno, sua duvida foi totalmente esclarecida, se sim, posso finalizar o post?
Responder

11/08/2015

Bruno Santana

Sim, pode finalizar... valeu
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar