Как вывести список 2 миллионов файлов в каталоге Java без исключения «недостаточно памяти» - PullRequest
20 голосов
/ 29 июня 2010

Мне приходится иметь дело с каталогом из примерно 2 миллионов xml, которые нужно обработать.

Я уже решил обработку, распределяющую работу между машинами и потоками с использованием очередей, и все идет хорошо.

Но сейчас большая проблема - узкое место чтения каталога с 2 миллионами файлов для постепенного заполнения очередей.

Я пытался использовать метод File.listFiles(), но он дает исключение java out of memory: heap space. Есть идеи?

Ответы [ 15 ]

0 голосов
/ 10 января 2013

Вы можете использовать listFiles со специальным FilenameFilter. При первой отправке FilenameFilter в listFiles он принимает первые 1000 файлов, а затем сохраняет их как посещенные.

В следующий раз, когда FilenameFilter отправляется в listFiles, он игнорирует первые 1000 посещенных файлов и возвращает следующие 1000 и т. Д. До завершения.

0 голосов
/ 29 июня 2010

Попробуй, мне это подходит, но у меня было не так много документов ...

File dir = new File("directory");
String[] children = dir.list();
if (children == null) {
   //Either dir does not exist or is not a  directory
  System.out.print("Directory doesn't  exist\n");
}
else {
  for (int i=0; i<children.length; i++) {   
    // Get filename of file or directory   
    String filename = children[i];  
}
0 голосов
/ 29 июня 2010

Если имена файлов соответствуют определенным правилам, вы можете использовать File.list(filter) вместо File.listFiles, чтобы получить управляемые части списка файлов.

0 голосов
/ 29 июня 2010

Пожалуйста, опубликуйте трассировку полного стека исключения OOM, чтобы определить узкое место, а также короткую, полную Java-программу, показывающую поведение, которое вы видите.

Скорее всего, потому что вы собираете все два миллиона записей в памяти, а они не помещаются. Вы можете увеличить пространство кучи?

0 голосов
/ 29 июня 2010

Во-первых, вы можете попытаться увеличить память вашей JVM с помощью -Xmx1024m, например,

...