具有大状态的erlang gen_server

时间:2011-02-26 23:17:01

标签: erlang

我有一个带有几千个条目的trie(用元组和列表实现),我想支持并发读取。数据的内存占用量在10-20 MB范围内。 trie只构建一次,之后才能读取。

维护状态并为客户端提供并发访问的推荐方法是什么?

以下是我的尝试:

1)创建一个以trie为状态的gen_server。这很好,但很明显,所有的电话都被序列化了。

2)修改(1)为每个调用生成一个新进程,该进程采用状态,请求和From。每个新进程遍历trie并使用结果调用gen_server:reply/2。此解决方案似乎不起作用,因为内存和CPU使用率爆炸。我假设发生这种情况是因为每次调用都会将状态复制到生成的进程中。

3 个答案:

答案 0 :(得分:5)

来自mochiweb的mochiglobal就是针对这种用例而设计的。基本上它将采用您的数据结构并将其编译为模块,因此数据是共享的(模块常量为零拷贝)。只适用于不经常更改的数据结构,但听起来就像你拥有的那样。

答案 1 :(得分:3)

如果您的州正在改变,通常会在ETS上实施您的模型/结构。

您可以创建具有并发读/写选项的ETS表,这将提高性能。

答案 2 :(得分:0)

另一种方法是创建一个gen_servers池(带有监督),然后将传入的连接分配给池中的服务器。这简化了与您的第一种方法相关的gen_server瓶颈。此方法还允许通过调整池中的进程数进行一些调整。 LearnYouSomeErlang有一章关于此。