私は、初心者のJavaおよびファイルです。ファイル内の特定のシンボルの出現を数えるタスクがありますが、スレッドの乱数を使用する必要があります。私の考えは、私が使用しなければならない多くのスレッドにファイルを分割し、それをコレクションに追加し、固定スレッドプールでExecutorServiceを使用することです。しかし、私は同じように大きな部分でファイルを分割する方法がわかりません。私はどんなヒントにも感謝しています!テキストファイルを分割し、パーツと同じ数のスレッドを使用して作業します。
2
A
答えて
0
ランダムなスレッド数はどういう意味ですか?あなたは、CPU上で利用可能なコアの数を意味するのですか?関数から乱数を引き出し、この数多くのスレッドを適用することができます。この問題を解決する上
私の見解は
- 配列リストに保存し、その内容によって、ループ、内のファイルを読むことです。
- 乱数に応じて配列リストを配列またはより小さい配列リストに分割します。
- ランダムな数のスレッドを作成し、スレッドプールに追加します。
- スレッド/配列リストをスレッド関数に渡すと、スレッド関数内のロジック(element.equals(symbol){then count}の場合)
- 各スレッドは数値を返し、これらの数値を加算して出現率を求めます。同じように、大きな部品でファイルを分割する方法
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。次に、ファイル読取りを並列化することが望ましい。
コードは依然として機能しますが、カウントタスクを実行する代わりに、ファイル書き込みタスクを提出します。
関連する問題
- 1. 同じページの別のWebパーツの値を使用してコンテンツクエリWebパーツをフィルタリングします。
- 2. PHPを使用して同じ文字列に分割する
- 3. 複数のスレッドに作業を分割する
- 4. Cocos2dを使用して同じスプライトで作業する
- 5. C# - テキストファイルの行番号を分割して使用する
- 6. GitHubを使用して同じファイルで作業している2人のユーザー
- 7. システム日付と同じ名前のテキストファイルを作成します。
- 8. 複数のスレッドは、ThreadLocalなしで同じSimpleDateFormatを使用します。
- 9. 同じ接続を使用した複数スレッドのWebリクエスト
- 10. divを分割してテキストを使用して分割します
- 11. ジョブを2つのスレッドに分割して使用wait、waitpid、fork
- 12. ブランチとラベルを使用して作業を分ける方法
- 13. Ruby:ファイルの一部を分割して読み込みスレッド数に応じて
- 14. 分割文字列と同じ数の
- 15. 同じデータバインディングコンテキストを使用して複雑なXMLレイアウトを分割する
- 16. テキストファイルを複数のテキストファイルに分割したい
- 17. スレッドを分割してもJava内の共通変数を保持します
- 18. Spliteratorを使用してConcurrentLinkedQueueを半分に分割します
- 19. 異なるスレッドから同じソケットを使って作業する
- 20. gitを使用してバージョン管理なしの人と共同作業する
- 21. スレッドとプロセスを使用して同じファイルに同時に書き込む
- 22. ファイルパス/ディレクトリを分割し、シェルスクリプトを使用して引数として使用する必要があります
- 23. re.splitをセパレータとして "コロン"を使用して分割し、\ "
- 24. 任意の通貨文字列 - すべてのパーツを分割しますか?
- 25. Tridion Coreサービス - 階層分類を使用して作業する
- 26. 新しい変数を作成して、データフレームのすべての変数を各行の同じ変数で分割します。 - R
- 27. iframeはオーナーと同じスレッドで動作しますか?
- 28. 新しいオブジェクトキーの作成や同じ関数内の変数としてパラメータを使用できますか?
- 29. PayPal支払いを複数の支払いに分割して同じ受信者に分割する
- 30. 春バッチ分割 - すべてのスレッドが同じレコードを処理する
['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) –