2010-08-31 10 views
5

Czytam dość duże linie (do 128K) tekstu przy użyciu fgets. Widzę nadmiernego kontekst przełączania na serwerze, używając strace widzę następujące:Wykonywanie fgetów powoduje dłuższe wywołania read() na Linuksie

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

tj fgets czyta kawałki 4096 bajtów na raz. Czy istnieje sposób kontrolowania, jak duże fragmenty używa fgets podczas wywoływania read()?

Odpowiedz

7

setvbuf będzie oczywistym miejscem do rozpoczęcia.

+0

Chciałbym np. * duży * bufor, ale wydawanie czyta w nieco mniejszych porcjach. przy ustawieniu setvbuf musiałbym ustawić maksymalny rozmiar bufora, a odczyty są wydawane w rozmiarze bufora (np. bufor 128k, odczyty sissues w porcjach 128k, co faktycznie okazuje się działać gorzej niż z odczytaniem 8192 bajtów , w moim przypadku) – Anonym

2

Funkcja fgets() jest częścią pakietu stdio i jako takie muszą buforowym (lub nie) do strumienia wejściowego w taki sposób, że jest zgodne z również za pomocą fgetc(), fscanf()fread(), i tak dalej. Oznacza to, że sam bufor (jeśli strumień jest buforowany) jest własnością obiektu FILE.

Niezależnie od tego, czy istnieje bufor, czy nie, a buforowany, to jak duży jest bufor, można zasugerować bibliotece, dzwoniąc pod numer setvbuf().

Implementacja biblioteki ma dużą swobodę ignorowania podpowiedzi i robienia tego, co uważa za najlepsze, ale bufory, które są "rozsądnymi" potęgami o dwóch rozmiarach, będą zwykle akceptowane. Zauważyłeś, że domyślną wartością jest 4096, która jest wyraźnie mniejsza niż optymalna.

Strumień jest buforowany domyślnie, jeśli jest otwarty w rzeczywistym pliku. Jego buforowanie na rurze, FIFO, TTY lub cokolwiek innego potencjalnie ma inne wartości domyślne.

Powiązane problemy