2016-06-21 3 views
1

Erlang версии 18,3Erlang етсь выбрать плохое ARG

получил странную ошибку с Erlang ИТС: выбрать/1

следующий код сделать выберите элемент из таблицы и взять их.

если я

save(10), %% insert 10 data 

remove(3) %% remove 3 data per time 

работает

если я

save(6007), %% insert more datas 

remove(400) %% remove 400 data per time 

это было плохо агд в ets:select(Cont) также, это было не в первом или во втором контуре , но всегда был там.

любое предложение?

-record(item, {name, age}). 
%% start the table 
start() -> 
ets:new(example_table, [public, {keypos, 2}, 
named_table, 
{read_concurrency, true}, 
{write_concurrency, true}]). 

%% insert n demo data 
save(Limit) -> 
All = lists:seq(1 ,Limit), 
All_rec = [#item{name = {<<"demo">>, integer_to_binary(V)} , age = V} || V <- All], 
ets:insert(example_table, All_rec). 

%% remove all data, n data per select 
remove(Limit) -> 
    M_head = #item{name = '$1', _ = '_'}, 
M_guards = [], 
M_result = ['$1'], 
M_spec = [{M_head, M_guards, M_result}], 

case ets:select(example_table, M_spec, Limit) of 
     '$end_of_table' -> 
     0; 
     {Keys, Cont} -> 

     remove(example_table, Keys, Cont, 0, []) 
     end. 

     remove(Table, [], Cont, Count, _Acc) -> 

     case ets:select(Cont) of 
      '$end_of_table' -> 
      Count; 
      {Keys, Cont_1} -> 

      remove(Table, Keys, Cont_1, Count, []) 
     end; 
     remove(Table,[Key | T], Cont, Count, Acc) -> 
     case ets:take(example_table, Key) of 
      [] -> 
     remove(Table, T, Cont, Count, Acc); 
      [Rec] -> 
     io:format("Rec [~p] ~n", [Rec]), 
     remove(Table, T, Cont, Count + 1, [Rec | Acc]) 
     end. 

трассировки стека

 4> example_remove:save(6007). 
     true 
    5> example_remove:remove(500). 
    ** exception error: bad argument 
    in function ets:select/1 
    called as ets:select({example_table,304,500,<<>>, 
          [{<<"demo">>,<<"2826">>}, 
           {<<"demo">>,<<"3837">>}, 
           {<<"demo">>,<<"5120">>}, 
           {<<"demo">>,<<"878">>}, 
           {<<"demo">>,<<"1195">>}, 
           {<<"demo">>,<<"1256">>}, 
           {<<"demo">>,<<"1449">>}, 
           {<<"demo">>,<<"5621">>}, 
           {<<"demo">>,<<"5768">>}], 
          9}) 
in call from example_remove:remove/5 (d:/workspace/simple-cache/src/example_remove.erl, line 47) 
+0

Какова цель этой части кода? Также покажите нам журнал ошибок, который вы получили. –

+0

Я не могу воспроизвести. – Lol4t0

+0

@ Lol4t0, какую версию erlang вы используете? – user3644708

ответ

3

Я считаю, что это происходит потому, что вы одновременно итерацию по таблице и изменить его.

Я предлагаю оберточную главный удалить цикл с охранниками safe_fixtable

remove(Limit) -> 
    ets:safe_fixtable(example_table, true), 
    M_head = #item{name = '$1', _ = '_'}, 
    M_guards = [], 
    M_result = ['$1'], 
    M_spec = [{M_head, M_guards, M_result}], 

    R = case ets:select(example_table, M_spec, Limit) of 
     '$end_of_table' -> 
      0; 
     {Keys, Cont} -> 
      remove(example_table, Keys, Cont, 0, []) 
    end, 
    ets:safe_fixtable(example_table, false), 
    R. 
+0

Спасибо. это имеет смысл. – user3644708

Смежные вопросы