我有一个带有几千个条目的trie(用元组和列表实现),我想支持并发读取。数据的内存占用量在10-20 MB范围内。 trie只构建一次,之后才能读取。
维护状态并为客户端提供并发访问的推荐方法是什么?
以下是我的尝试:
1)创建一个以trie为状态的gen_server。这很好,但很明显,所有的电话都被序列化了。
2)修改(1)为每个调用生成一个新进程,该进程采用状态,请求和From
。每个新进程遍历trie并使用结果调用gen_server:reply/2
。此解决方案似乎不起作用,因为内存和CPU使用率爆炸。我假设发生这种情况是因为每次调用都会将状态复制到生成的进程中。
答案 0 :(得分:5)
答案 1 :(得分:3)
如果您的州正在改变,通常会在ETS上实施您的模型/结构。
您可以创建具有并发读/写选项的ETS表,这将提高性能。
答案 2 :(得分:0)
另一种方法是创建一个gen_servers池(带有监督),然后将传入的连接分配给池中的服务器。这简化了与您的第一种方法相关的gen_server瓶颈。此方法还允许通过调整池中的进程数进行一些调整。 LearnYouSomeErlang有一章关于此。