ネットワーク ドライブ上のディレクトリを調べて、階層内の子から親へのマップを作成する必要があります。1 つの代表的なディレクトリは 6 テラバイトで、900,000 個のファイルと 900 個のフォルダーがあります。ファイルではなく、フォルダーのみを気にします。テスト目的で、ファイルのないフォルダーを別のネットワーク ドライブにコピーし、コピーしたバージョンでコードを実行しました。900 個のフォルダーを反復処理するだけで、おそらく 10 秒かかります。ただし、元のディレクトリ構造を反復処理するには 30 分かかります。900,000 個のファイルすべてを無視しているように見えます。
ファイルを見なくてもこれをスピードアップする方法はありますか? 可能であれば、純粋な Java を使用したいと考えています。この巨大なディレクトリを Windows Explorer でブラウズすると、まったく遅く感じません。私のコードは以下です。
public static Map<String, String> findFolderPaths(File parentFolder) throws IOException {
Map<String, String> parentFolderMap = new HashMap<String, String>();
Files.walkFileTree(parentFolder.toPath(), new FolderMappingFileVisitor(parentFolderMap));
return parentFolderMap;
}
static class FolderMappingFileVisitor extends SimpleFileVisitor<Path> {
private Map<String, String> mapping;
FolderMappingFileVisitor(Map<String, String> map) {
this.mapping = map;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
File directory = dir.toFile();
mapping.put(directory.getName(), directory.getParent());
return FileVisitResult.CONTINUE;
}
}
編集:
言及しなかったパズルの重要なピースは、webstart でアプリを実行していることです。私が報告した時間は、開発ではなく、本番環境のものです。Eclipse から実行すると、FileWalker に期待するよりも時間がかかります。