Почему Erlang ETS использует ненормальную память при вставке длинного списка - PullRequest
0 голосов
/ 30 января 2019

У меня странная проблема, когда я вставляю длинный список в ets.Потребление памяти неоправданно велико, если я вставляю двоичный файл, он выглядит нормально, но когда я вставляю список с 10000+ символами, это стоит более 250 МБ системной памяти, когда размер таблицы ETS составляет всего 31 МБ.Кто-нибудь знает, что случилось?

Спасибо ~~

Эрик

----- команда оболочки -----

Erlang/OTP 17 [erts-6.1] [source-d2a4c20] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.1  (abort with ^G)
1> c(test).
{ok,test}
2> test:new().
true
3> test:loop(test:x2()).
----Proc 0.2196502685546875 MB: ETS(1401): 31.17036533355713 MB
<0.41.0>

----- Исходный кодпожалуйста, измените двоичные данные в последней строке -----

    -module(test).
-export([new/0, loop/1, loop/2, x1/0, x2/0]).
get_current_process_memory() -> element(2, erlang:process_info(self(), memory))/(1024*1024).

new() ->
    try 
        ets:new(temp, [ordered_set, named_table, public])
    catch
        _ -> ok
    end.

%size(Item) -> erts_debug:flat_size(Item)/(1024*1024).

loop(X) -> 
    spawn(fun() ->
        loop(X, 1400),
        io:format("----Proc ~p MB: ETS(~p): ~p MB~n", [get_current_process_memory(), ets:info(temp, size), ets:info(temp, memory)/(1024*1024)])  
    end).

loop(_, 0) -> ok;
loop(X, Count) ->
     ets:insert(temp, {Count,X}),
    loop(X, Count - 1).

x2() -> binary_to_list(x1()).
x1() -> <<"very long, more than 10000 chars here.">>.
...