5

を使用して、かなり大きな行 (最大 128K) のテキストを読んでいますfgets。サーバーで過度のコンテキスト切り替えが発生しています。strace次のように表示されます。

read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096

つまりfgets、一度に 4096 バイトのチャンクを読み取ります。fgetsを呼び出すときに大きなチャンクがどのように使用されるかを制御する方法はありますread()か?

4

2 に答える 2

7

setvbuf明らかに開始する場所です。

于 2010-08-31T19:18:20.307 に答える
2

この関数は stdio パッケージの一部であるため、、などfgets()の使用と一致する方法で入力ストリームをバッファする (またはバッファしない) 必要があります。これは、バッファ自体 (ストリームがバッファリングされている場合) がオブジェクトのプロパティであることを意味します。fgetc()fscanf()fread()FILE

バッファがあるかどうか、およびバッファされている場合はバッファの大きさは、 を呼び出すことによってライブラリに提案できますsetvbuf()

ライブラリの実装には、ヒントを無視して最善と思われることを実行するかなりの自由度がありますが、サイズが 2 の「妥当な」累乗であるバッファは通常受け入れられます。デフォルトが 4096 であることに気付きましたが、これは明らかに最適値よりも小さい値です。

ストリームが実際のファイルで開かれる場合、ストリームはデフォルトでバッファリングされます。パイプ、FIFO、TTY、またはその他のものでのバッファリングには、潜在的に異なるデフォルトがあります。

于 2010-09-01T02:19:36.583 に答える