1

次のような構造を持つ大きなファイルを読みたいと思います。

        John  10  department
        Hello 14   kjezlkjzlkj
        jhfekh 144 lkjzlkjrzlj
        ........

問題は、このファイルを C++ で読み込んでいる間、ディスクへの I/O アクセスの数を最小限にしたいということです。ディスク上のファイルにアクセスし、ファイルの大部分をメモリに読み取り (その 1 つのディスク アクセス)、ファイルの 2 番目の大部分を読み取る (2 番目のディスク アクセスなど) 方法はありますか?

どんな助けでも大歓迎です。

4

3 に答える 3

3

大きなバッファーを作成し、1 回の読み取りでいっぱいにするだけです。必要に応じて繰り返します。

ストリーム (stdio) はこれを実装します。setbufferを使用fopenしてから使用できます

編集

それはかなり単純です

   /* 5MB - Can increase or decrease this to your hearts content */
   #define BUFFER_SIZE 5242880

   char buffer[BUFFER_SIZE];
   file = fopen("filename", "r");
   setbuffer(file, buffer, BUFFER_SIZE);

次に、任意の操作を使用して読み取りfscanfなどを行いますfgets

編集

すみません、C++ であることに気付きませんでした

これがC++のコードです

#include <iostream>
#include <fstream>
using namespace std;

...

const int BUFFER_SIZE = 5242880;

filebuf fb;
char buffer[BUFFER_SIZE];
fb.setbuf(buffer, BUFFER_SIZE);
fb.open ("test.txt",ios::in);
istream is(&fb);

その後、使用できますint i; is >> i

幸せな今ティノ・ディドリクセン

于 2012-12-02T13:52:17.440 に答える
0

オペレーティング システムによって異なります。まず、大きなバッファを使用したい場合があります。この質問を参照してください。(また、読み取りがシーケンシャルかどうかにも依存します)。

mmapまたは、Linux や Posixのように、低レベルのシステム コールを使用することもできます。(または少なくとも、read大きなメガバイト サイズのバッファーを使用する場合)。

于 2012-12-02T13:51:41.150 に答える