2016-08-31 15 views
0

ファイルの一覧(27000個)があります。目的は、ディレクトリ構造(サブディレクトリの複数のレベルを持つ)でこれらのファイルのそれぞれを検索し、不足しているファイルを印刷することです。私は、ファイルの存在を検索するための再帰関数を持つコードを持っています。コードは動作しているようですが、検索するファイルの数が非常に多い場合、この特定のシナリオでは非常に遅いです。このコードのパフォーマンスを向上させる方法はありますか?サブディレクトリのあるディレクトリ内のファイルの一覧を高速で検索する

コードスニペットは以下の通りです:すでにコメントで述べた

public static boolean walk(String path, String fileName) throws Exception { 

    File root = new File(path); 
    File[] list = root.listFiles(); 

    if (list == null) 
     return false; 

    for (File f : list) { 
     if (f.isDirectory()) { 
      walk(f.getAbsolutePath(), fileName); 
     } else { 
      if (f.getAbsoluteFile().getName().equalsIgnoreCase(fileName)) { 
       presentFiles.add(f.getAbsoluteFile().getName()); 
       throw new Exception("hi"); 
      } 
     } 
    } 
    return false; 
} 



public static void main(String[] args) { 

    int i = 0; 

    for (String fileName : attrSet) {//attrSet is HashSet of all the files which are being searched. 
     try{ 
     boolean isFileFound = walk(source, fileName); 
     } 
     catch(Exception e) { 
      System.out.println(e.getMessage() + i++); 
     } 
    } 

    attrSet.removeAll(presentFiles); //presentFiles is HashSet of all files present in the directory 

    for (String fileNm : attrSet) { 
     System.out.println("FileName : " + fileNm); 
    } 

} 
+1

'各ファイル名に対して(再帰的)'から '再帰的{ファイル名ごとに}'に変更してみてください。 –

+0

また例外を取り除いて戻り値を使用してください。 – Andreas

答えて

1

、周りのプロセスを回す:

  1. ハッシュにリスト内のファイル名を入れて再帰的にトラバース
  2. を設定一度ディレクトリ構造を削除すると、見つかったすべてのファイルがハッシュセットから削除されます
  3. ハッシュセットに不足ファイルのみが含まれるようになりました。

これは、(ディスクキャッシュを考慮しない場合)1つのファイルをテストするのとほぼ同じ時間かかるでしょう。したがって、スピードアップはほぼ27000倍になります。

+0

また、常に 'getAbsolutePath()'/'getAbsoluteFile()'を呼び出さないでください。最初のパラメータを 'File'に変更し、最初の' source'を絶対 'File'にします。 ['listFiles()'](https://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles())のjavadocは次のように言っています:*このパス名が絶対パスであれば各パス名は絶対パスです*。 ---これは、 'File root'がなくなり、再帰呼び出しが' walk(f、fileName) 'になることを意味します。 – Andreas

+0

ご協力ありがとうございます@Henry。 – user3677652

関連する問題