3

是否可以使用 Scala 延续(在 2.8 中引入)递归遍历目录?

我的目录包含数百万个文件,所以我不能使用aStream因为我会内存不足。我正在尝试编写一个Actor 调度来让工作人员并行处理文件。

有人有例子吗?

4

3 回答 3

3

如果你想坚持使用 Java 1.6(而不是FileVistor1.7),并且你有子目录而不是一个目录中的所有数百万个文件,你可以

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)
    }
  }
}

这要求您的文件系统没有循环。如果它确实有循环,您需要跟踪您在一组中点击的目录并避免再次递归它们。(如果您甚至不想在文件从两个不同位置链接的情况下两次点击文件,那么您必须将所有内容放入一个集合中,使用迭代器而不是仅仅将所有文件信息读入没有多大意义记忆。)

于 2012-03-22T18:18:25.447 回答
1

这更像是对问题的质疑,而不是答案。

如果您的进程受 I/O 限制,则并行处理可能不会大大提高您的吞吐量。在许多情况下,它会导致磁盘磁头抖动,从而使情况变得更糟。在你沿着这条线做很多事情之前,看看磁盘有多忙。如果它大部分时间都在忙于一个线程,那么最多再增加一个线程将是有用的——即使这样也可能适得其反。

于 2012-03-22T17:32:42.887 回答
0

使用一个怎么样Iterator

于 2012-03-22T18:45:03.747 回答