2

一連のjava.io.Fileオブジェクトを想像してみてください。シーケンスは特定の順序ではなく、ディレクトリトラバーサルの後に入力されます。ファイルの名前は次のようになります。

/some/file.bin
/some/other_file_x1.bin
/some/other_file_x2.bin
/some/other_file_x3.bin
/some/other_file_x4.bin
/some/other_file_x5.bin
...
/some/x_file_part1.bin
/some/x_file_part2.bin
/some/x_file_part3.bin
/some/x_file_part4.bin
/some/x_file_part5.bin
...
/some/x_file_part10.bin

基本的に3種類のファイルがあります。最初のタイプは単純なもので、.bin拡張子だけがあります。2番目のタイプのファイルは、_x1.bintillから形成されたファイルです_x5.bin_part1そして、3番目のタイプのファイルは、からまでの10個の小さなパーツで構成できます_part10。名前がおかしいかもしれないことは知っていますが、これは私が作業しなければならないことです:)

ファイルをグループ化したいので(ファイルのすべての部分を一緒に処理する必要があります)、これを行うために並列配列を使用することを考えていました。すべてのスレッドが同じ配列で動作するため、reduce/accumulationの部分をどのように実行できるかがわかりません。

val allBinFiles = allBins.toArray // array of java.io.File

私はそのようなものを扱うことを考えていました:

val mapAcumulator = java.util.Collections.synchronizedMap[String,ListBuffer[File]](new java.util.HashMap[String,ListBuffer[File]]())

allBinFiles.par.foreach { file =>
   file match {
      // for something like /some/x_file_x4.bin nameTillPart will be /some/x_file
      case ComposedOf5Name(nameTillPart) => {
          mapAcumulator.getOrElseUpdate(nameTillPart,new ListBuffer[File]()) += file
      }
      case ComposedOf10Name(nameTillPart) => {
          mapAcumulator.getOrElseUpdate(nameTillPart,new ListBuffer[File]()) += file
      }
      // simple file, without any pieces
      case _ => {
          mapAcumulator.getOrElseUpdate(file.toString,new ListBuffer[File]()) += file
      }
   }
}

私は上記のコードで示したようにそれを行うことを考えていました。ファイルのエクストラクタを持ち、パスの一部をマップのキーとして使用します。たとえばのように、の/some/x_file値として保持でき/some/x_file_x1.binます/some/x_file_x5.bin。また、これを処理するためのより良い方法があるかもしれないと思います。ご意見をお待ちしております。

4

1 に答える 1

1

別の方法は、以下を使用することgroupByです。

val mp = allBinFiles.par.groupBy {
  case ComposedOf5Name(x) => x
  case ComposedOf10Name(x) => x
  case f => f.toString
}

これにより、ファイルの並列配列の並列マップが返されます(ParMap[String, ParArray[File]])。この時点からのファイルのシーケンシャルシーケンスのシーケンシャルマップが必要な場合:

val sqmp = mp.map(_.seq).seq

並列処理を確実に開始するには、並列配列(10k +)に十分な要素があることを確認してください。

于 2011-05-11T08:06:00.557 に答える