2011-07-15 1 views
1

Quelles sont les conséquences de l'écriture de grandes quantités de données sur disque à l'aide d'E/S sans tampon (au moins pour tout ce qui se trouve au-dessus du niveau du système d'exploitation)?Conséquences des E/S de fichier sans tampon

Détails:

J'écris un script Ruby qui exécutera un autre morceau de code, la capture de son stdout et stderr et les écrire dans un fichier. Apparemment (dans Ruby, au moins), stderr n'est pas tamponné et stdout est tamponné, ce qui dans mon cas se traduit par une sortie en désordre car les lignes stderr sont imprimées avant certaines lignes stdout.

Il semble que la solution consiste à faire en sorte que cette partie du code utilise des E/S non tamponnées (avec IO.sync = true). Toutefois, le morceau de code que mon script exécute écrit également de grandes quantités de texte sur le disque. Donc, je me demande quelle est la conséquence de ne pas utiliser le tampon Ruby (seulement le tampon du système d'exploitation et ci-dessous), et si c'est important, comment puis-je contourner le problème de commande?

Répondre

1

Les E/S sans tampon sont plus lentes que les E/S tamponnées lorsque les opérations d'écriture ont de petits comptes et que la situation est inversée pour les opérations d'écriture de grand nombre. Dans une gamme moyenne d'environ 1000 à 10 000 octets par opération, cela ne fait pas beaucoup de différence.

Vous verrez également des performances légèrement meilleures lorsque les opérations sont alignées

0

Ce que IO.sync fait est basculer le vidage automatique du tampon, mais ne change pas le fait qu'il est encore tamponné.

Ce que vous voudrez peut-être à la place est de contourner le système de mise en mémoire tampon tout à fait et utiliser IO#syswrite à la place:

STDERR.syswrite("Look ma, no buffers") 

Comme dit la documentation, vous devez choisir soit bufferisés ou non et le bâton avec, comme le mélange et la mise en correspondance peut causer des problèmes.

+0

Peut-être que j'utilise alors une mauvaise terminologie. Je n'ai pas besoin d'utiliser 'syswrite', juste 'vider' les flux résout mon problème (mauvais ordre de stdout/stderr redirigé). Ma question est: quelles sont les conséquences de l'écriture de grandes quantités de texte sur le disque alors que 'IO.sync' est' true'? – jrdioko

+0

Rappelez-vous que le tampon est automatiquement vidé quand il est plein de toute façon, donc si le montant que vous écrivez atteindrait fréquemment cette limite, la différence est mineure. Typiquement le tampon est de l'ordre de 1-2KB. – tadman

Questions connexes