gpt4 book ai didi

erlang - BERT为二进制字符串时如何解码BERT

转载 作者:行者123 更新时间:2023-12-05 01:21:46 24 4
gpt4 key购买 nike

我有BERT通过查询字符串传递给 Erlang。我正在通过带有 http_bin 选项的 gen_tcp 读取它,所以它像这样到达 <<"131,104,1,100,0,2,104,105">>。这几乎是正确的,因为我想用 binary_to_term/2 解码它。但是 binary_to_term/2 想要一个二进制二进制文件,而不是一个字符串二进制文件(它想要 <<131,104,1,100,0,2,104,105>> 而不是 <<"131,104,1,100,0,2,104,105">>)。

我可以像这样将它解析为正确的形式。

parse(Source) ->
Bins = binary:split(Source, <<",">>, [global]),
parse(Bins, []).
parse([H | T], Acc) ->
parse(T, [list_to_integer(binary_to_list(H)) | Acc]);
parse([], Acc) ->
list_to_binary(lists:reverse(Acc)).

但这看起来很复杂,而且比我希望的要慢(大约 5k/秒,每个 200 字节)。还提出了一些基于 io_lib:fread/2 的东西,但它并没有好多少,而且看起来仍然很尴尬。

  1. 是否有可能执行此操作的 BIF 或 NIF?

  2. 如果不是,是否有更好的方法来执行上述操作以加快速度?

最佳答案

就其值(value)而言,另一种解决方案 - 可能更慢,但可能不那么临时,具体取决于口味 - 将其视为解析 Erlang 子集的问题,为此存在工具:

parse(Source) ->
case erl_scan:string(Source++" .") of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Bin} when is_binary(Bin) -> % Only accept binary literals.
Bin;
_ -> error(badarg)
end;
_ -> error(badarg)
end.

在这种情况下可能有点矫枉过正,但代码不会比原始解决方案多。

关于erlang - BERT为二进制字符串时如何解码BERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225546/

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