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

How to reduce the process 's memory usage when I convert a ets table to list in Erlang?

当我尝试通过 ets:tab2list 将 ets table 转换为列表时遇到严重问题。

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

但是当我尝试将此 table 转换为列表时,它将占用大约 400 MB 的进程内存,并且进程的内存使用似乎与 table 和项目的大小有关。当我尝试转换包含 10000 个项目的 200 MB table 时。它几乎在一行内耗尽了我的 VM 内存,并使我的程序因 OS.

而终止

还有其他好的方法可以处理我的情况吗?似乎 ets 不适合我的用例?或者还有其他好的方法可以将 ets table 转换为列表而不消耗太多内存?

谢谢~~

埃里克

ps: 我使用 table 对 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 上成功插入后删除记录。

此致。