Problema ao ter de inspecionar grande quantidade de arquivos criados em diretório
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 ?
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
Curtidas 0
Melhor post
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 ?
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
29/07/2015
Opa, muito interessante Ronaldo...
Muito obrigado pela resposta! Sempre salvando!!!
Muito obrigado pela resposta! Sempre salvando!!!
GOSTEI 0
Ronaldo Lanhellas
29/07/2015
Disponha, boa sorte.
GOSTEI 0
Roniere Almeida
29/07/2015
Bruno, sua duvida foi totalmente esclarecida, se sim, posso finalizar o post?
GOSTEI 0
Bruno Santana
29/07/2015
Sim, pode finalizar... valeu
GOSTEI 0