当我尝试通过ets:tab2list将ets表转换为列表时遇到了一个严重的问题。
我在ets表中有1500个项目,其中大多数都有一个密钥,其值约为20K文本数据。 ets表的表大小约为30 MB。
但是,当我尝试将此表转换为列表时,它将花费约400 MB的进程内存,并且似乎该进程的内存使用量与表和项目的大小有关。当我尝试转换具有10000个项目的200 MB表时。它几乎将我的VM的内存占用了一行,并使我的程序被操作系统终止。
还有其他处理我案件的好方法吗?看来ets对我的用例不利吗?还是有其他不错的方法可以将ets表转换为列表而又不消耗太多内存?
谢谢~~
埃里克
ps: 我使用一张表将redis命令的命令列表放入队列中,并且稍后将批量插入redis以免网络繁忙。每个项目看起来像
{index, {["set", "key"], "text"}
我需要
形式的批处理命令 [["set", "key1", "text1"], ["set", "key2", "text2"]]
在我的情况下,文本是大约20000个单词的文档
答案 0 :(得分:1)
您可以尝试通过以下方式实施批处理方法:
ets:select(Tab, MatchSpec, Limit) ->
{[Match], Continuation} | '$end_of_table'
或
ets:match(Tab, Pattern, Limit) ->
{[Match], Continuation} | '$end_of_table'
因此您的批次大小为Limit
,并且在redis上成功插入后可以删除de记录。
致谢。