2010-08-31 9 views
5

Estoy leyendo líneas bastante grandes (hasta 128K) de texto usando fgets. Estoy viendo contexto excesiva de encender el servidor, utilizando strace veo lo siguiente:Haciendo que los números emitan llamadas de lectura más largas() en linux

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

decir fgets lee trozos de 4096 bytes a la vez. ¿Hay alguna manera de controlar la forma en que los grandes fragmentos fgets se usan al llamar al read()?

Respuesta

7

setvbuf sería el lugar obvio para comenzar.

+0

Me gustaría, por ejemplo, sin embargo, un * buffer * grande, pero emitiendo lecturas en trozos algo más pequeños. con setvbuf tendría que establecer un tamaño máximo del búfer y las lecturas se emiten en el tamaño del búfer (por ejemplo, un búfer de 128k, las sissues se leen en trozos de 128k, lo que realmente resulta peor que hacer lecturas de 8192 bytes , en mi caso) – Anonym

2

La función fgets() es parte del paquete de stdio, y como tal debe tampón (o no) el flujo de entrada de una manera que es consistente con también usando fgetc(), fscanf(), fread() y así sucesivamente. Eso significa que el propio buffer (si el flujo está almacenado en el buffer) es propiedad del objeto FILE.

Si hay un búfer o no, y si está almacenado en búfer, qué tan grande es el búfer, puede sugerirse a la biblioteca llamando al setvbuf().

La implementación de la biblioteca tiene una buena cantidad de latitud para ignorar pistas y hacer lo que cree mejor, pero los búferes que son poderes "razonables" de dos en tamaño generalmente serán aceptados. Ha notado que el valor predeterminado era 4096, que es claramente más pequeño que el óptimo.

La secuencia se almacena en el búfer por defecto si se abre en un archivo real. Su almacenamiento en búfer en una tubería, FIFO, TTY o cualquier otra cosa tiene potencialmente diferentes valores predeterminados.

Cuestiones relacionadas