この質問は StackOverflow で頻繁に繰り返されますが、以前の関連する回答をすべて読み、質問に少しひねりを加えています。
同じサイズの 4 億 7500 万行を含む 23Gb ファイルがあり、各行は 40 文字のハッシュ コードとそれに続く識別子 (整数) で構成されています。
受信ハッシュ コードのストリーム (合計で数十億) があり、受信ハッシュ コードごとに、それを見つけて、対応する識別子を出力する必要があります。このジョブは大規模ですが、一度だけ実行する必要があります。
ファイルが大きすぎてメモリに読み込めないため、次の方法でmmapを使用しようとしています:
codes = (char *) mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,codefile,0);
次に、コード内のアドレスに基づいて、アドレス演算を使用してバイナリ検索を実行します。
これは見事に機能し始めたようで、CPU を 100% 使用して数秒で数百万の識別子を生成しますが、その後、一見ランダムな時間が経過すると速度が遅くなり、クロールします。ps を使用してプロセスを確認すると、CPU を 100% 使用している状態 "R" から、CPU を 1% 使用している状態 "D" (ディスクバウンド) に変化しています。
これは繰り返し可能ではありません。同じデータに対してプロセスを再度開始できますが、「クロールが遅い」状態になるまでに 5 秒または 10 秒かかる場合があります。昨夜、これが起こる前に、私はそれからほぼ1分かかりました。
すべてが読み取り専用で、ファイルへの書き込みは試みておらず、マシン上の (制御している) 他のすべてのプロセスを停止しました。最新の Red Hat Enterprise Linux 64 ビット マシンです。
プロセスがディスクバウンドになる理由と停止方法を知っている人はいますか?
アップデート:
回答してくれた皆さん、そしてあなたのアイデアに感謝します。どういうわけかmmapを間違って使用しているのではないかと思っていたので、以前はさまざまな改善をすべて試したことがありませんでした。しかし、答えの要点は、すべてをメモリに詰め込むことができなければ、必然的に問題が発生するということでした. そこで、ハッシュ コードのサイズを、重複を作成しない先頭のプレフィックスのサイズに縮小しました。最初の 15 文字で十分でした。次に、結果のファイルをメモリに取り込み、入力されたハッシュ コードをそれぞれ約 20 億のバッチで実行しました。