一連の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.bin
tillから形成されたファイルです_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
。また、これを処理するためのより良い方法があるかもしれないと思います。ご意見をお待ちしております。