ets:delete slow when using complex keys ?

Pascal Brisset pascal.brisset@REDACTED
Tue Oct 9 13:56:05 CEST 2001


The code below shows that ets:delete can take as much as 70 seconds to
free a 60MB ETS table, and that other processes are frozen during that
time (tested on OTP R7B-1 and P8A-20011007, linux, x86, 400MHz).

The delay seems to depend a lot on the complexity of keys (only 4
seconds if we replace PIDs with atoms). Could there be a problem in
free_hash_table()/free_tree_table() ?

My problem is that mnesia_recover.erl builds such tables and deletes
them every few minutes. Can this problem be avoided with some magic
combination of system_flags, process_flags and mnesia parameters ?

-- Pascal Brisset <pascal.brisset@REDACTED> +33141986741 --
----- Cellicium | 73 avenue Carnot | 94230 Cachan | France -----


-module(etsdelete).
-compile(export_all).

start() ->
    spawn(?MODULE, check_realtime, [1.0e20]),
    T = ets:new(tbl, [{keypos, 2}, set, public]),
    io:format("Filling...~n"),
    fill(T, 1000000),
    io:format("Deleting...~n"),
    ets:delete(T),
    io:format("Done~n").

fill(T, 0) -> ok;
fill(T, N) ->
    ets:insert(T, {transient_decision,{tid,N,self()},committed}),
    %% ets:insert(T, {transient_decision,{tid,N,committed},self()}),
    fill(T, N-1).

check_realtime(Time) ->
    receive after 100 -> ok end,
    {MS,S,US} = now(),
    Time1 = (MS*1000000+S)*1000 + US div 1000,
    Delay = Time1 - Time,
    if Delay > 1000 -> io:format("Been sleeping for ~p ms !~n", [Delay]);
       true -> ok
    end,
    check_realtime(Time1).




More information about the erlang-questions mailing list