2016-11-03 5 views
1

大きなファイル(20GB)を持つC++で範囲検索コードを実装していて、別のクエリの特定の範囲を検索する必要があります。
私は2つのレベルのルートとリーフを持ち、データがリーフに格納されている(ISAMツリーの考え方に従う)検索を固定するために大きなファイルを小さな塊に分割しました。

すなわち: 私は100000ライン (ルートが30000を有する)各ページにパイントルートで30000ページ、各ページに分割されたデータ
の3000 000 000行を有します。複数の読み込み後にI/Oストリームが遅くなる

しかし、検索範囲が200ページ以上になると、ストリームが大幅に遅くなることに気付きました。私はそれを終えた後、それぞれのページを閉じます。読書の流れが非常に遅くなる理由は何ですか?

  • 私はザ・読み取り
  • は、これらのファイルから連続しているマルチスレッド実行するオプションを持っていないLinuxマシン
  • 上で実行しています。
+0

さらに詳しい情報を提供し、プロファイリングも行う必要があります。遅さを見始めると、システムで何が起きているかを主に確認する必要があります。 top、iostat、free、/ proc/meminfoの出力を参照してください...あなたのロジックに迷惑をかけない限り、C++の問題ではなくシステムレベルの問題をもっと見ています – Arunmu

+0

ページスワップがたくさん見え始めると、あなたのシステムでhugepagesを有効にするには(私はそのlinuxを仮定しています) – Arunmu

+0

また、私はあなたが何らかのシーケンシャルな読書をしていると仮定します。 – Arunmu

答えて

0

読み込みストリームが非常に遅くなるのはなぜですか?

キャッシュミス!

ファイルの解析速度は、ファイルシステムのキャッシュによって大きく異なります。それらが存在すると、解析は比較的速くなります。もしそうでなければ、それはそれほど速くはありません。

大きなファイル(20GB)がありますが、大きすぎてキャッシュに収まらない場合があります。その結果、キャッシュが使い果たされ、プログラムはディスクからデータをフェッチすることになります(パフォーマンスを大幅に低下させます)。

関連する問題