当我将ets表转换为Erlang中的列表时,如何减少进程的内存使用?

时间:2019-01-25 12:10:54

标签: erlang ets

当我尝试通过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个单词的文档

1 个答案:

答案 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记录。

致谢。