7

Linux 64 ビット (Amazon EC2 インスタンスなど) では、いくつかの大きなバイナリ ファイルをメモリにロードする必要があります。最速の方法は何ですか?

  • イフストリーム
  • 恐れる
  • POSIXオープン
  • POSIX mmap (実際にはファイル全体をメモリにロードしないため、パフォーマンスが低下します)
  • 他の何か?

また、ノードはこの実行可能ファイルを 2 回目に起動する場合と起動しない場合があるため、その後の試行でファイルがさらに高速にロードされると役立ちます。ある種のプリロード手順が機能する場合もあります。

4

3 に答える 3

6

時間はディスク I/O によって支配されるため、どの API を使用するかは、ディスクがどのように機能するかを考えるほど重要ではありません。ディスク (回転メディア) にランダムにアクセスすると、シークに 3 ~ 9 ミリ秒かかります... ディスクがストリーミングされると、約 128 MB/秒を維持できます。SATA リンクまたは PCIe バスには、それよりもはるかに高い帯域幅 (600 ~ 2000 MB/秒) があります。Linux のメモリにはページ キャッシュがあり、ディスク上のページのコピーを保持します。そのため、マシンに十分な量の RAM があれば、データにランダムにアクセスしたとしても、その後の試行は高速になります。そのため、アドバイスは一度に大きなブロックで読み取られます。本当に初期読み込みを高速化したい場合は、mmap を使用してファイル全体 (1GB ~ 4GB) をマップし、各ページの最初のバイトを順番に読み取るヘルパー スレッドを用意します。

ディスク ドライブのパフォーマンス特性の詳細については、こちらを参照してください。

ページ キャッシュの詳細については、こちらを参照してください。

于 2013-02-11T22:46:10.613 に答える
0

フラグmmapで試すことができます。MAP_POPULATEこれ以上早くできるとは思えません。

于 2013-02-15T03:37:29.243 に答える
0

上記の情報を考えると、私mmapは良い候補だと思います。私が言ういくつかの理由があります: 1. 実際にその部分が必要になるまでファイルを実際にロードすることなく、ファイル全体を提供します。これは高速読み込みの利点ですが、最終的にすべてのバイトを処理する場合 (またはファイルのすべての 4KB セクションに触れる場合) は、大きな違いはありません。2.mmapは、データをディスクからページに 1 回だけコピーします。fread私のテストでは、これは Linux を使用して読み取るよりも効率的です(また、かなり大きな読み取りの場合のとreadの違いは無視できることに注意してください。freadreadFILEただし、私の経験では [これまでにさまざまな形式を試してきました]。

いつものように、ベンチマークは常にインターネットでの質問よりも優先されます。したがって、私が上で述べたことはあなたの状況では正しくないことに気付くかもしれません. そして、指摘したように、コードが十分に優れていると、コードのオーバーヘッドは、ディスクがデータを配信できる速度によって小さくなります.ディスク転送速度がボトルネックになるところです。その時点でできることは、他のオーバーヘッドをできるだけ少なくし、ディスクがデータを配信した後、できるだけ早くアプリケーションにデータを取得することだけです。

「1 秒あたりのバイト数」の適切なベンチマークは、使用することです (これはファイルを書き込みます。その後、ディスクからどれだけうまく読み取れるかを確認し dd if=/dev/zero of=somefile bs=4K count=1Mたい場合があります。dd if=somefile of=/dev/null bs=4K

于 2013-02-11T23:39:44.997 に答える