Szukaj…


Wprowadzenie

Podczas gdy ciąg Erlang jest listą liczb całkowitych, „iolist” to lista, której elementami są liczby całkowite, binaria lub inne iolisty, np. ["foo", $b, $a, $r, <<"baz">>] . Iolist reprezentuje ciąg "foobarbaz" .

Chociaż iolist można przekonwertować na plik binarny za pomocą iolist_to_binary/1 , często nie jest to konieczne, ponieważ funkcje biblioteki Erlang, takie jak file:write_file/2 i gen_tcp:send/2 akceptują iolisty oraz ciągi i pliki binarne.

Składnia

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

Uwagi

Co to jest Iolist?

To dowolny plik binarny. Lub dowolna lista zawierająca liczby całkowite od 0 do 255. Lub dowolna dowolnie zagnieżdżona lista zawierająca jedną z tych dwóch rzeczy.

Oryginalny artykuł

Użyj głęboko zagnieżdżonych list liczb całkowitych i plików binarnych do reprezentowania danych We / Wy, aby uniknąć kopiowania podczas łączenia łańcuchów lub plików binarnych.

Są wydajne nawet w przypadku łączenia dużych ilości danych. Na przykład połączenie dwóch pięćdziesięciu kilobajtowych plików binarnych przy użyciu składni binarnej <<B1/binary, B2/binary>> zazwyczaj wymagałoby ponownego przydzielenia obu do nowego pliku binarnego 100 kb. Korzystanie z list we / wy [B1, B2] przydziela tylko listę, w tym przypadku trzy słowa. Lista używa jednego słowa i drugiego słowa na element, więcej informacji znajdziesz tutaj .

Użycie operatora ++ stworzyłoby zupełnie nową listę, a nie tylko nową listę dwóch elementów. Odtwarzanie list w celu dodania elementów na końcu może być kosztowne, gdy lista jest długa.

W przypadkach, gdy dane binarne są małe, przydzielanie list We / Wy może być większe niż dołączanie plików binarnych. Jeśli dane binarne mogą być małe lub duże, często lepiej jest zaakceptować stały koszt list IO.

Pamiętaj, że dołączanie plików binarnych jest zoptymalizowane zgodnie z opisem tutaj . Krótko mówiąc, plik binarny może mieć przydzielone dodatkowe, ukryte miejsce. Zostanie on wypełniony, jeśli zostanie do niego dołączony inny plik binarny, który mieści się w wolnej przestrzeni. Oznacza to, że nie każdy dodatek binarny spowoduje pełną kopię obu plików binarnych.

Listy IO są zwykle używane do budowania danych wyjściowych na porcie, np. W pliku lub gnieździe sieciowym.

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

Dodaj dozwolone typy danych na początku listy IO, tworząc nowy.

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

Dane IO można skutecznie dodawać na końcu listy.

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

Uważaj na niewłaściwe listy

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

W powłoce będzie to wydrukowane jako ["Guten tag "|<<"Hello">>] zamiast ["Guten tag ",<<"Hello">>] . Operator potoku utworzy niepoprawną listę, jeśli ostatni element po prawej stronie nie jest listą. Chociaż niepoprawna lista, której „ogon” jest plikiem binarnym, nadal jest prawidłowym iolistem, niepoprawne listy mogą powodować problemy, ponieważ wiele funkcji rekurencyjnych oczekuje, że pusta lista będzie ostatnim elementem, a nie, jak w tym przypadku, plikiem binarnym.

Uzyskaj rozmiar listy IO

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

Rozmiar iolist można obliczyć za pomocą iolist_size/1 . Ten fragment oblicza rozmiar wiadomości oraz tworzy i dołącza ją z przodu jako czterobajtowy plik binarny. Jest to typowa operacja w protokołach przesyłania wiadomości.

Lista IO może być konwertowana na plik binarny

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

Listę IO można przekonwertować na plik binarny za pomocą funkcji iolist_to_binary/1 . Jeśli dane będą przechowywane przez długi czas lub wysyłane jako wiadomość do innych procesów, warto przekonwertować je na plik binarny. Jednorazowy koszt konwersji na plik binarny może być tańszy niż wielokrotne kopiowanie listy IO, w przypadku wyrzucania elementów bezużytecznych w jednym procesie lub przesyłania wiadomości do innych.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow