Прежде всего, есть ли у вас возможность использовать Java 7? Там у вас есть FileVisitor
и Files.walkFileTree
, которые, вероятно, должны работать в рамках ваших ограничений памяти.
В противном случае я могу думать только о том, чтобы использовать File.listFiles(FileFilter filter)
с фильтром, который всегда возвращает false
(гарантируя, что полный массив файлов никогда не будет храниться в памяти), но который ловит файлы. обрабатываться по пути и, возможно, помещать их в очередь производителя / потребителя или записывать имена файлов на диск для последующего обхода.
В качестве альтернативы, если вы управляете именами файлов или если они именуются каким-либо приятным способом, вы можете обрабатывать файлы в чанках, используя фильтр, который принимает имена файлов в форме file0000000
- filefile0001000
затем file0001000
- filefile0002000
и т. Д.
Если имена не названы по-хорошему, вы можете попробовать отфильтровать их по хеш-коду имени файла, который должен быть равномерно распределен по набору целых чисел.
Обновление: Вздох. Вероятно, не будет работать. Только что взглянул на реализацию listFiles:
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList v = new ArrayList();
for (int i = 0 ; i < ss.length ; i++) {
if ((filter == null) || filter.accept(this, ss[i])) {
v.add(new File(ss[i], this));
}
}
return (File[])(v.toArray(new File[v.size()]));
}
так что, вероятно, в любом случае он потерпит неудачу на первой строке ... Что-то вроде разочарования. Я считаю, что ваш лучший вариант - поместить файлы в разные каталоги.
Кстати, не могли бы вы привести пример имени файла? Они "догадываются"? Как
for (int i = 0; i < 100000; i++)
tryToOpen(String.format("file%05d", i))