30GB(2,500万行)という膨大なファイルを読み込もうとしています。私はスレッドプールを作成し、各スレッドは1000行を並列に読み込みます(最初のスレッドは最初の1000行を読み込み、2番目のスレッドは次の1000を読み込むなど)。 ファイル全体を読み込んでスレッドプールを作成しましたが、今は各スレッドが1000行だけを読み込み、次のスレッドが読み込む必要がないように読み込まれた行番号を確実に追跡できるようにしていますそれらの行。すべてのスレッドがラインのほぼ等しい数を持っているacceaptableならマルチスレッドを使用して30GBファイルを読む
答えて
A.、次のことができます。
- スレッドプールのサイズがNであると仮定し、第一のスレッドは、30ギガバイト/ Nをオフセット0のファイルと[0を読みしよう)、2番目のスレッドは30GB/Nをオフセットしようとします。[30GB/N、30GB/N * 2など]
- 2番目のスレッドは、行の先頭ではなく行の中央にあります。大丈夫です。正義線をスキップして、完全な線を読んでください。第1のスレッドは、部分線で終わってもよい。大丈夫です。「\ n」を読むまで読書を続けてください。残りのスレッドは同じことを行います。すべてのスレッドがラインの正確euqal数を持たなければならない場合
B.は、それはあなたには、1000行を言うことができます:
- はインデックスマップを構築し、あるスレッドがファイル全体を読みました。マップはオフセット0から始まるline0〜line999、オフセットline1000〜line1999はオフセット13521で始まるなどの情報を持っています。
- すべてのスレッドはそれに応じてオフセットからファイルを読み取り、1000行を読み込みます。
アプローチAはファイルを1回読み取ります。アプローチBはファイルを2回読み込みます。
アプローチAまたはBを使用すると、すべてのスレッドでファイルを処理(変換、抽出、クリーニング)することができます。しかし、処理が非常に速い場合、境界はディスク速度です。次に、アプリケーションはIOバウンドになります。あなたはただ1つのスレッドにファイルを読み込ませ、処理を逐次行わなければなりません。
アプローチBは、私が追求したロジックですが、すでにスレッド間で読み込まれている行番号を共有するという問題がありました。ファイルを読み取る単一のスレッドは、ファイルの内容をキューに入れて、特定の行のキューを同時に読み取るのが面倒になります。すでに読み取られた行を示すスレッドセーフカウンタを維持します。 –
「最初のスレッドは最初に読み込みます1000行 "私は、行のグループを一緒に処理する必要があると思った。そのような制約がない場合は、最初の小さなN(1、2、okです)行を読み、1番目のスレッドに与え、2番目の小さなNの行を2番目のスレッドに渡します。 – waltersu
@ChristineDsouzaあなたはすでにアプローチしています。あなたのコードと、スレッドセーフな問題についてのあなたの質問を表示してください。 – waltersu
- 1. マルチスレッドを使用してtxtファイルを読む
- 2. BZ2 JSON twitterファイルを使用して大きな(30GB +)TARファイルをPostgreSQLに効率的に読み込む方法
- 3. Javaを使用してバッチで非常に大きなcsvファイル(30GB以上)を読む方法
- 4. 大きなファイルをマルチスレッドで読む
- 5. Scannerを使用してファイルを読む
- 6. マルチスレッドの読み書きPythonを使用したファイル
- 7. マルチスレッドを使用したファイル読み込みの書き込み
- 8. データベースからデータを読み取り、マルチスレッドを使用してファイルに書き込む
- 9. Javaでマルチスレッド(プロデューサコンシューマモデル)を使用してファイルを読み書きする
- 10. javascriptを使用してアップロードしたxmlファイルを読むには?
- 11. マルチスレッドを使用して1行だけを読み取る
- 12. 特定のエンコーディングを使用してtsvファイルを読むR
- 13. SQLalchemyを使用して大きなファイルを読む
- 14. pdfファイルを読むpowershellスクリプトを使用してカスタムドキュメントのプロパティ
- 15. Node.jsを使用してjQueryのHTMLファイルを読む方法
- 16. Appsスクリプトを使用してGoogleドライブでxmlファイルを読む
- 17. Apache POIを使用してMS Excelファイルを読むには?
- 18. セレンを使用してPDFファイルを読む方法
- 19. nibファイルを使用してUIViewを読み込む方法
- 20. Java 8を使用してファイルからデータを読み込む
- 21. javascriptを使用してPDFファイルを読む
- 22. PowerShellを使用してExcelファイルからコメントを読む
- 23. Apache POI&docx4jを使用してdocファイルを読む
- 24. javascriptを使用してepubファイルを読む方法
- 25. ChromeでJavaScriptを使用してXMLファイルを読む
- 26. J2MEを使用して.xlsファイルを読む方法
- 27. AJAX + Javascriptを使用してチャンク内のファイルを読む
- 28. AudioKitを使用してMIDIファイルから音符を読む
- 29. wstringを使用して行を読み込むファイル
- 30. PHPを使用してtxtファイルからチェコ語を読む
この問題を解決したら、磁気ドライブを使用していますか?それにかかわらず、これはIOバウンドになります。 –
1つのスレッドで大きなチャンク(30GB)を読み取ると、通常は25000スレッドが小さなチャンクを読み取るよりも高速になります。 25000スレッドには多くのオーバーヘッドがあり、1つのディスクに1つのファイルがある場合、各スレッドはキュー内のアクセス時間を待たなければなりません。 –
通常は、ファイルなどの外部リソースを操作するスレッドは1つしかありません。パフォーマンスを向上させないI/Oを配布しようとするのではなく、リーダースレッドが各バンドルを並行キューに入れて、それをexecutorタスクに送信するようにします。 – chrylis