Recherche…


Introduction

Alors qu'une chaîne Erlang est une liste d'entiers, un "iolist" est une liste dont les éléments sont soit des entiers, des binaires ou d'autres iolists, par exemple ["foo", $b, $a, $r, <<"baz">>] . Cet iolist représente la chaîne "foobarbaz" .

Bien que vous puissiez convertir un iolist en binaire avec iolist_to_binary/1 , vous n’avez pas souvent besoin, puisque les fonctions de la bibliothèque Erlang telles que file:write_file/2 et gen_tcp:send/2 acceptent les iolists ainsi que les chaînes et les binaires.

Syntaxe

  • -type iolist () :: Maybe_improper_list (byte () | binary () | iolist (), binary () | []).

Remarques

Qu'est-ce qu'un iolist?

C'est n'importe quel binaire. Ou toute liste contenant des nombres entiers compris entre 0 et 255. Ou toute liste arbitrairement imbriquée contenant l'une de ces deux choses.

Article original

Utilisez des listes profondément imbriquées d'entiers et de binaires pour représenter les données d'E / S afin d'éviter la copie lors de la concaténation de chaînes ou de fichiers binaires.

Ils sont efficaces même en combinant de grandes quantités de données. Par exemple, combiner deux binaires de cinquante kilo-octets utilisant la syntaxe binaire <<B1/binary, B2/binary>> nécessiterait généralement une réallocation des deux fichiers dans un nouveau binaire de 100 kb. L'utilisation des listes d'E / S [B1, B2] que la liste, en l'occurrence trois mots. Une liste utilise un mot et un autre mot par élément, voir ici pour plus d'informations.

L'utilisation de l'opérateur ++ aurait créé une toute nouvelle liste au lieu d'une nouvelle liste à deux éléments. Recréer des listes pour ajouter des éléments à la fin peut devenir coûteux lorsque la liste est longue.

Dans les cas où les données binaires sont petites, l'allocation des listes d'E / S peut être supérieure à l'ajout des fichiers binaires. Si les données binaires peuvent être petites ou grandes, il est souvent préférable d'accepter le coût constant des listes d'E / S.

Notez que les fichiers binaires sont optimisés comme décrit ici . En bref, un binaire peut avoir un espace supplémentaire caché. Cela sera rempli si un autre binaire est ajouté à celui-ci qui correspond à l'espace libre. Cela signifie que toutes les extensions binaires ne provoqueront pas une copie complète des deux fichiers.

Les listes IO sont généralement utilisées pour générer une sortie vers un port, par exemple un fichier ou un socket réseau.

file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).

Ajoutez les types de données autorisés au début d'une liste d'E / S, en en créant une nouvelle.

["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].

Les données IO peuvent être efficacement ajoutées à la fin d'une liste.

Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].

Soyez prudent avec les listes inappropriées

["Guten tag " | <<"Hello">>].

Dans le shell, ceci sera imprimé comme ["Guten tag "|<<"Hello">>] au lieu de ["Guten tag ",<<"Hello">>] . L'opérateur de canal créera une liste incorrecte si le dernier élément à droite n'est pas une liste. Bien qu'une liste impropre dont la "queue" est un binaire est toujours un iolist valide, des listes incorrectes peuvent causer des problèmes car de nombreuses fonctions récursives s'attendent à ce qu'une liste vide soit le dernier élément, et non un binaire.

Obtenir la taille de la liste IO

Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].

La taille d'un iolist peut être calculée à l'aide de iolist_size/1 . Cet extrait de code calcule la taille d'un message et le crée et l'ajoute au recto sous la forme d'un fichier binaire de quatre octets. Ceci est une opération typique dans les protocoles de messagerie.

La liste IO peut être convertie en binaire

<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).

Une liste IO peut être convertie en un binaire en utilisant la fonction iolist_to_binary/1 . Si les données doivent être stockées pendant une longue période ou envoyées sous forme de message à d'autres processus, il peut être judicieux de les convertir en un fichier binaire. Le coût unique de la conversion en fichier binaire peut être moins coûteux que de copier la liste des entrées-sorties à plusieurs reprises, lors de la récupération de la mémoire d'un processus unique ou lors de la transmission de messages à d'autres utilisateurs.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow