3

Scala 継続 (2.8 で導入) を使用してディレクトリを再帰的にウォークすることは可能ですか?

私のディレクトリには何百万ものファイルが含まれているため、メモリ不足になるためaを使用できません。ワーカー アクターにファイルを並行して処理させるディスパッチStreamを作成しようとしています。Actor

誰にも例がありますか?

4

3 に答える 3

3

(1.7 ではなく) Java 1.6 に固執したい場合FileVistorで、1 つのディレクトリに何百万ものファイルすべてではなくサブディレクトリがある場合は、次のことができます。

class DirectoryIterator(f: File) extends Iterator[File] {
  private[this] val fs = Option(f.listFiles).getOrElse(Array[File]())
  private[this] var i = -1
  private[this] var recurse: DirectoryIterator = null
  def hasNext = {
    if (recurse != null && recurse.hasNext) true
    else (i+1 < fs.length)
  }
  def next = {
    if (recurse != null && recurse.hasNext) recurse.next
    else if (i+1 >= fs.length) {
      throw new java.util.NoSuchElementException("next on empty file iterator")
    }
    else {
      i += 1;
      if (fs(i).isDirectory) recurse = new DirectoryIterator(fs(i))
      fs(i)
    }
  }
}

これには、ファイルシステムにループがないことが必要です。ループがある場合は、セット内でヒットしたディレクトリを追跡し、それらの再帰を避ける必要があります。(ファイルが 2 つの異なる場所からリンクされている場合にファイルを 2 回ヒットしたくない場合は、すべてをセットに入れる必要があり、すべてのファイル情報を単に読み取る代わりにイテレータを使用してもあまり意味がありません。メモリー。)

于 2012-03-22T18:18:25.447 に答える
1

これは、答えというよりも、質問に疑問を投げかけるものです。

プロセスがI/Oバウンドの場合、並列処理ではスループットがそれほど向上しない可能性があります。多くの場合、ディスクヘッドのスラッシングを引き起こして、事態を悪化させます。この方針に沿って多くのことを行う前に、ディスクがどれだけビジーであるかを確認してください。単一のスレッドでほとんどの時間すでにビジー状態になっている場合は、最大でもう1つのスレッドが役立ちます。それでも、逆効果になる可能性があります。

于 2012-03-22T17:32:42.887 に答える
0

使用するのはIteratorどうですか?

于 2012-03-22T18:45:03.747 に答える