【问题标题】:How does Erlang handle very large message?Erlang 如何处理非常大的消息?
【发布时间】:2012-10-12 03:57:22
【问题描述】:

我使用 ODBC 从数据库中查询表:

getTable(Ref,SearchKey) ->
Q = "SELECT * FROM TestDescription WHERE NProduct = " ++ SearchKey,
case odbc:sql_query(Ref,Q) of 
    {_,_,Data} ->
        %io:format("GetTable Query ok ~n"),
        {ok, Data};     
    {error,_Reason} ->
        %io:format("Gettable Query error ~p ~n",[_Reason]),
        {stop, odbc_query_failed};
    _-> 
        io:format("Error Logic in getTable function ~n")
end.

这个函数将返回一个包含所有数据库数据的元组。将其发送到另一个进程:

 OtherProcessPid!{ok,Data};

它适用于少量的行,但是如果是非常大的行数,例如超过一百万呢? erlang 仍然可以使用它吗?

【问题讨论】:

  • > 100 万列?你的意思是行对吗?
  • 另外,看起来您正在混合模块和流程的概念。消息被发送到进程,这些进程可以执行来自许多模块的代码。
  • 是的,行不是列。对,发送到进程而不是模块。感谢您指出我的错误

标签: erlang


【解决方案1】:

问题不是“Erlang 可以处理超大消息吗?”(它可以),而是“你准备好处理超大消息的后果了吗?”

所有消息都被复制(一些较大的二进制文件除外):这意味着如果您要处理大量大型消息的消息传递,您必须为一些减速做好准备,内存使用的稳定性比小型消息低得多,等等.

在分布式 Erlang 的情况下,需要“上传”到远程节点的非常大的消息可能会阻塞心跳,如果延迟太短,则可以知道 VM 是否处于活动状态,或者消息太大,不适合您发送它们的频率。

在任何情况下,解决方案都是衡量您能处理或不能处理的问题。我不知道关于消息大小的硬编码限制。不过,作为一般经验法则,较小的消息通常更可取。

【讨论】:

  • 非常感谢。这正是我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多