Scala 継続 (2.8 で導入) を使用してディレクトリを再帰的にウォークすることは可能ですか?
私のディレクトリには何百万ものファイルが含まれているため、メモリ不足になるためaを使用できません。ワーカー アクターにファイルを並行して処理させるディスパッチStream
を作成しようとしています。Actor
誰にも例がありますか?
(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 回ヒットしたくない場合は、すべてをセットに入れる必要があり、すべてのファイル情報を単に読み取る代わりにイテレータを使用してもあまり意味がありません。メモリー。)
これは、答えというよりも、質問に疑問を投げかけるものです。
プロセスがI/Oバウンドの場合、並列処理ではスループットがそれほど向上しない可能性があります。多くの場合、ディスクヘッドのスラッシングを引き起こして、事態を悪化させます。この方針に沿って多くのことを行う前に、ディスクがどれだけビジーであるかを確認してください。単一のスレッドでほとんどの時間すでにビジー状態になっている場合は、最大でもう1つのスレッドが役立ちます。それでも、逆効果になる可能性があります。
使用するのはIterator
どうですか?