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

当我将ets表转换为Erlang中的列表时,如何减少进程的内存使用?,erlang,ets,Erlang,Ets,当我试图通过ets:tab2list将ets表转换为列表时,遇到了一个严重的问题 我在ets表中有1500个项目,其中大多数都有一个值约为20K文本数据的键。ets表格的表格大小约为30 MB 但是,当我尝试将此表转换为列表时,它将花费大约400 MB的进程内存,并且进程的内存使用似乎与表和项的大小有关。当我试图转换一个包含10000项的200 MB表时。它几乎在一行内占用了我虚拟机的内存,使我的程序被操作系统终止 还有别的好办法处理我的案子吗?看来ets不适合我的用例?或者有其他好方法可以将e

当我试图通过ets:tab2list将ets表转换为列表时,遇到了一个严重的问题

我在ets表中有1500个项目,其中大多数都有一个值约为20K文本数据的键。ets表格的表格大小约为30 MB

但是,当我尝试将此表转换为列表时,它将花费大约400 MB的进程内存,并且进程的内存使用似乎与表和项的大小有关。当我试图转换一个包含10000项的200 MB表时。它几乎在一行内占用了我虚拟机的内存,使我的程序被操作系统终止

还有别的好办法处理我的案子吗?看来ets不适合我的用例?或者有其他好方法可以将ets表转换为列表,而无需占用太多内存

谢谢~~

埃里克

附言:
我使用一个表对redis命令的命令列表进行排队,并将在稍后对redis进行批插入,以避免繁忙的网络操作。每个项目看起来像

{index, {["set", "key"], "text"}
我需要一个以

[[set,key1,text1],[set,key2,text2]]


在我的例子中,文本是大约20000字的文档

您可以尝试通过以下方式实现批处理:

ets:select(Tab, MatchSpec, Limit) -> 
    {[Match], Continuation} | '$end_of_table'

因此,您的批量大小已超出限制,您可以在redis上成功插入后删除de记录


注意。

为什么您需要一次将整个ets表作为一个列表?我使用一个表将redis命令的命令列表排队,稍后将批量插入redis以避免繁忙的网络操作。每个项看起来像{index,{[set,key],text},我需要一个[[set,key1,text1],[set,key2,text2]形式的批处理命令。在我的例子中,文本是大约20000字的文档。我看到Erlang在stdlib中有一个队列,我可以混合使用队列和ets来实现我的请求吗?实际上我只需要一个全局内存空间来放置命令。不管是什么。只需按队列进行测试。结果似乎更糟。我尝试在一个简单的文件中模拟该行为,但内存使用情况看起来很糟糕很好。只是在循环中消耗了10~20 MB内存。这真的很奇怪为什么这个问题发生在我当前的项目中,但是我发现如果我在我的函数中删除binary\u to\u list函数,内存不足的问题不会像预期的那样发生。但是binary\u to\u list在我的简单项目中工作得很好!!
ets:match(Tab, Pattern, Limit) ->
     {[Match], Continuation} | '$end_of_table'