当我试图通过ets:tab2list将ets表转换为列表时,遇到了一个严重的问题。
我在ets表中有1500个项目,其中大多数都有一个值约为20K文本数据的键。ets表的表大小约为30 MB。
但是当我尝试将这个表转换为列表时,它将花费大约400MB的进程内存,并且进程的内存使用似乎与表&项目的大小。当我尝试转换一个包含10000个项目的200 MB表时。它几乎在一行中占用了我的虚拟机的内存,并使我的程序被操作系统终止。
还有其他好办法处理我的案子吗?ets似乎不适合我的用例?或者还有其他好方法可以在不消耗太多内存的情况下将ets表转换为列表?
谢谢你~~
Eric
ps:我使用一个表来对redis命令的命令列表进行排队,稍后将对redis进行批量插入,以避免繁忙的网络操作。每个项目看起来都像
{index, {["set", "key"], "text"}
我需要一个形式的批处理命令
[["set", "key1", "text1"], ["set", "key2", "text2"]]
在我的情况下,文本是大约20000字的文档
您可以尝试使用以下方法来实现批处理
ets:select(Tab, MatchSpec, Limit) ->
{[Match], Continuation} | '$end_of_table'
或
ets:match(Tab, Pattern, Limit) ->
{[Match], Continuation} | '$end_of_table'
所以你的批量大小是Limit
,你可以在redis上成功插入后删除de记录。
谨致问候。