2016-09-06 3 views
2

私は、初心者のJavaおよびファイルです。ファイル内の特定のシンボルの出現を数えるタスクがありますが、スレッドの乱数を使用する必要があります。私の考えは、私が使用しなければならない多くのスレッドにファイルを分割し、それをコレクションに追加し、固定スレッドプールでExecutorServiceを使用することです。しかし、私は同じように大きな部分でファイルを分割する方法がわかりません。私はどんなヒントにも感謝しています!テキストファイルを分割し、パーツと同じ数のスレッドを使用して作業します。

+0

['File.length()'](https://docs.oracle.com/javase/7/docs/api/java/io/File.html#length())と['RandomAccessFile']( https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html) –

答えて

0

ランダムなスレッド数はどういう意味ですか?あなたは、CPU上で利用可能なコアの数を意味するのですか?関数から乱数を引き出し、この数多くのスレッドを適用することができます。この問題を解決する上

私の見解は

  1. 配列リストに保存し、その内容によって、ループ、内のファイルを読むことです。
  2. 乱数に応じて配列リストを配列またはより小さい配列リストに分割します。
  3. ランダムな数のスレッドを作成し、スレッドプールに追加します。
  4. スレッド/配列リストをスレッド関数に渡すと、スレッド関数内のロジック(element.equals(symbol){then count}の場合)
  5. 各スレッドは数値を返し、これらの数値を加算して出現率を求めます。同じように、大きな部品でファイルを分割する方法
0

、全体のファイルを読むために速くなるだろうとして、実際にはI/Oが複数のスレッドに読み込み、理にかなっていない

分割シングルスレッド(ランダムアクセスと競合が少ない) See this question for why

したがって、チャンクが十分に大きくなるたびに、ファイルを順番に読み取って、チャンクでチャンクし、シンボルカウントタスクを送信するだけです。

java.util.Scannerは、ファイルの内容全体をメモリに入れずにストリーミングすることができます。これは、サイズがRAMを超えるファイルに適しているからです。

StringBuffer chunk = new StringBuffer(); 
    try(FileInputStream inputStream = new FileInputStream("filename.txt"); 
     Scanner sc = new Scanner(inputStream, "UTF-8")) { 

     while (sc.hasNextLine()) { 

      chunk.append(sc.nextLine()); 
      if (chunk.length() > FILE_SIZE/THREAD_NB) { 
       executorService.submit(() -> handleChunkSymbolCounting(chunk)); 
       chunk = new StringBuffer(); 
      } 
     } 
    } 

NB:あなたは物理分割ファイルを、必要な場合はあなたがfile001.txt様中間ファイルを作成したい場合、すなわち、file002.txt ... fileXXX.txt。次に、ファイル読取りを並列化することが望ましい。

コードは依然として機能しますが、カウントタスクを実行する代わりに、ファイル書き込みタスクを提出します。

関連する問題