Рекурсивно ходить по БОЛЬШОМУ каталогу, используя продолжения Scala 2.8 - PullRequest
3 голосов
/ 22 марта 2012

Можно ли рекурсивно пройти каталог, используя продолжения Scala (введено в 2.8)?

В моем каталоге содержатся миллионы файлов, поэтому я не могу использовать a Stream, потому что у меня не хватит памяти. Я пытаюсь написать Actor рассылка , чтобы рабочие субъекты обрабатывали файлы параллельно.

У кого-нибудь есть пример?

Ответы [ 3 ]

3 голосов
/ 22 марта 2012

Если вы хотите придерживаться Java 1.6 (в отличие от FileVistor в 1.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)
    }
  }
}

Это требует, чтобы ваша файловая система не имела петель . Если в нем есть циклы, вам нужно отслеживать каталоги, в которые вы попали, и избегать повторного их повторения. (Если вы даже не хотите дважды нажимать на файлы, если они связаны из двух разных мест, вам нужно поместить все в набор, и нет смысла использовать итератор вместо простого чтение всей информации о файле в память.)

1 голос
/ 22 марта 2012

Это больше вопрос, чем ответ.

Если ваш процесс связан с вводом / выводом, параллельная обработка может существенно не повысить вашу пропускную способность. Во многих случаях это ухудшит , вызывая трепетание головки диска. Прежде чем проделать большую работу в этом направлении, посмотрите, насколько занят диск. Если он уже большую часть времени занят одним потоком, будет полезен максимум один поток, и даже это может привести к обратным результатам.

0 голосов
/ 22 марта 2012

Как насчет использования Iterator?

...