2010-08-31 18 views
5

Je lis des lignes assez grandes (jusqu'à 128K) de texte en utilisant fgets. Je vois contexte excessif de commutation sur le serveur, en utilisant strace je vois ce qui suit:Faisant des questions plus longues read() appels sur Linux

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

dire fgets lit des morceaux de 4096 octets à la fois. Existe-t-il un moyen de contrôler la façon dont les gros blocs fgets utilisent pour appeler read()?

Répondre

7

setvbuf serait l'endroit évident pour commencer.

+0

Je voudrais par exemple. un * grand * tampon cependant, mais l'émission se lit en morceaux plus petits. avec setvbuf, je devrais définir une taille maximale du buffer et les lectures sont émises dans la taille du buffer (par exemple un buffer de 128k, des sissues se lisent en morceaux de 128k, ce qui s'avère pire qu'effectuer des lectures de 8192 octets , dans mon cas) – Anonym

2

La fonction fgets() fait partie du paquet de stdio, et comme tel, il faut un tampon (ou non) le flux d'entrée d'une manière qui est cohérente avec l'aide aussi fgetc(), fscanf(), fread() et ainsi de suite. Cela signifie que le tampon lui-même (si le flux est tamponné) est la propriété de l'objet FILE.

S'il existe un tampon ou non, et s'il est tamponné, la taille du tampon peut être suggérée à la bibliothèque en appelant setvbuf().

L'implémentation de la bibliothèque a une bonne latitude pour ignorer les indications et faire ce qu'elle pense le mieux, mais les tampons qui sont des puissances «raisonnables» de deux sont généralement acceptés. Vous avez remarqué que la valeur par défaut était 4096, ce qui est nettement inférieur à l'optimum.

Le flux est mis en mémoire tampon par défaut s'il est ouvert sur un fichier réel. Sa mise en mémoire tampon sur un canal, un FIFO, un TTY ou tout autre élément a potentiellement des valeurs par défaut différentes.