gpt4 book ai didi

performance - Erlang:以有效的方式从输入流中读取

转载 作者:行者123 更新时间:2023-12-03 21:46:10 26 4
gpt4 key购买 nike

我正在编写一个从 读取的程序输入 流,即

erl -run p main -noshell -s erlang halt < input

问题是使用这个读取函数读取它需要很多时间(输入流很大):
read_input(L) ->
case io:get_line("") of
eof ->
lists:reverse(L);
E0 ->
read_input([E0|L])
end.

我一直在寻找更有效的替代方案,但一无所获。我尝试使用读取文件
{ok, Binary} = file:read_file("input")

这效率要高得多。问题是我必须在名称未知的平台上运行这个程序,所以我需要一些替代方法来这样做。此外,我无法选择运行时使用的标志,例如标志 -noinput 不能添加到命令行。

您可以提供的任何帮助都会受到欢迎。

最佳答案

您可以使用 open_port/2 打开标准输入并从中读取二进制文件。例如:

-module(p).
-export([start/0]).

start() ->
process_flag(trap_exit, true),
P = open_port({fd,0,1}, [in, binary]),
Bin = read(P,<<>>),
io:format("received ~p\n", [Bin]),
halt(0).

read(P, Bin) ->
receive
{P, {data, Data}} ->
read(P, <<Bin/binary, Data/binary>>);
{'EXIT',P,_} ->
Bin
end.

代码必须捕获退出,以便知道在端口关闭时退出其读取循环。此示例将所有内容读入从 read/2 返回的单个二进制文件中函数,然后将其打印出来并退出,但显然您可以在实际应用程序中对二进制文件执行进一步的操作。

你可以这样运行:
erl -noinput -s p < input

关于performance - Erlang:以有效的方式从输入流中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37090322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com