私が働いている私の場所では、ファイルごとに100万行を超えるファイルがありました。サーバーのメモリは10GBを超え、JVMは8GBですが、サーバーがしばらくハングして他のタスクを停止することがあります。
コードのプロファイルを作成したところ、ファイル読み取りメモリの使用量がギガバイト単位で頻繁に増加し(1GBから3GB)、その後突然正常に戻ることがわかりました。この頻繁な高メモリ使用と低メモリ使用により、サーバーがハングするようです。もちろん、これはガベージコレクションによるものです。
パフォーマンスを向上させるためにファイルを読み取るには、どのAPIを使用する必要がありますか?
今、私はBufferedReader(new FileReader(...))
これらのCSVファイルを読み取るために使用しています。
プロセス:ファイルをどのように読み取っていますか?
- 私はファイルを1行ずつ読みます。
- すべての行にはいくつかの列があります。それに応じて解析するタイプに基づいて(doubleのコスト列、intのvisit列、Stringのキーワード列など)。
- 適格なコンテンツ(visit> 0)をHashMapにプッシュし、最後にタスクの最後にそのMapをクリアします
アップデート
私はこの30または31ファイル(1か月のデータ)の読み取りを行い、適格なものをマップに保存します。後でこのマップを使用して、さまざまなテーブルの犯人を取得します。したがって、読み取りは必須であり、そのデータの保存も必須です。HashMapの部分をBerkeleyDBに切り替えましたが、ファイルを読み取るときの問題は同じか、さらに悪いです。