В Эрланге есть такая вещь, которая называется iolist
.Это одна из величайших вещей, изобретенных после нарезанного хлеба.(Лично я считаю, что нарезанный хлеб не очень хорош, но это фраза, которая обычно используется, поэтому я ее оставлю). Это формат, который позволяет вам выполнять множество операций очень эффективно.Например, если вы хотите просто добавить новую строку после каждого двоичного файла в вашем List
.
> List = [<<"Lucky Labon: Hey">>,<<"Lucky Labon: Keep?">>, <<"Lucky Labon: Alpine is...">>].
[<<"Lucky Labon: Hey">>,<<"Lucky Labon: Keep?">>,
<<"Lucky Labon: Alpine is...">>]
> S = [[X,$\n] || X <- List].
[[<<"Lucky Labon: Hey">>,10],
[<<"Lucky Labon: Keep?">>,10],
[<<"Lucky Labon: Alpine is...">>,10]]
Это в основном операция O (N), где N - это число двоичных файлов в вашем списке.Это не может быть более эффективным, чем это.Не происходит никакого копирования данных оригинальных двоичных файлов.Издержки очень минимальны, и вся стандартная библиотека, работающая с операциями ввода-вывода, поддерживает обработку iolists.Вы всегда можете изменить iolist на двоичный файл или выполнить операцию ввода-вывода с ним.
> iolist_to_binary(S).
<<"Lucky Labon: Hey\nLucky Labon: Keep?\nLucky Labon: Alpine is...\n">>
> io:put_chars(S).
Lucky Labon: Hey
Lucky Labon: Keep?
Lucky Labon: Alpine is...
ok
Операция ввода-вывода или преобразование в двоичный файл iolist - это операция O (N), где N - размер выходного сигнала.Это не может быть более эффективным, чем это.(Подсистема IO может даже использовать системный вызов writev (), который вообще исключает копирование любого буфера пользовательского пространства и делает IO еще более эффективным.) Простое практическое правило - использовать iolist, когда у вас нет веских причин не делать этого.