使用Scala2.8 continuations递归遍历LARGE目录



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

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

有人举个例子吗?

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

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

这要求您的文件系统没有循环。如果它确实有循环,您需要跟踪在一个集中命中的目录,并避免再次递归。(如果文件从两个不同的地方链接,你甚至不想两次点击,那么你必须将所有都放入一个集合中,使用迭代器而不是将所有文件信息读取到内存中没有多大意义。)

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

如果您的进程是I/O绑定的,那么并行处理可能不会大大提高您的吞吐量。在许多情况下,它会导致磁盘头抖动,从而使变得更糟。在你做这方面的工作之前,先看看磁盘有多忙。如果它大部分时间都忙于一个线程,那么最多再多一个线程会很有用,甚至可能会适得其反。

使用Iterator怎么样?

相关内容

  • 没有找到相关文章

最新更新