짧은 버전 : ets:foldl
을 사용하여 모든 ETS 레코드를 삭제하는 것이 안전합니까?ets 사용 : 가난한 사람으로서의 폴드 모든 레코드에 대해
ETS 테이블에 정보가 누적되어 이제는 모두 처리해야한다고 가정합니다. 레코드가 테이블에서 읽히고 어떤 식 으로든 사용 된 다음 삭제됩니다. (또한 표가 private
이므로 동시성 문제는 발생하지 않습니다.)
유사한 언어로 된 다른 데이터 구조에서는 for ... each 루프를 사용하여 모든 레코드를 처리 한 다음 해시에서 삭제할 수 있습니다/dict/map/뭐든간에. 그러나 ets
모듈에는 foreach
이 없습니다. lists
않습니다.
그러나이 작업을 수 있습니다
1> ets:new(ex, [named_table]).
ex
2> ets:insert(ex, {alice, "high"}).
true
3> ets:insert(ex, {bob, "medium"}).
true
4> ets:insert(ex, {charlie, "low"}).
true
5> ets:foldl(fun({Name, Adjective}, DontCare) ->
io:format("~p has a ~p opinion of you~n", [Name, Adjective]),
ets:delete(ex, Name),
DontCare
end, notused, ex).
bob has a "medium" opinion of you
alice has a "high" opinion of you
charlie has a "low" opinion of you
notused
6> ets:info(ex).
[...
{size,0},
...]
7> ets:lookup(ex, bob).
[]
이 선호하는 접근 방식인가? 적어도 정확하고 버그가 없습니까?
ets:foldl documentation은 데이터 구조를 수정하는 과정에서 일반적인 우려가 있지만 foldl
내부의 레코드를 수정하는 것이 ETS에 매우 편합니다. 본질적으로 테이블을 깨끗이 닦고 있기 때문에 확실하게 알고 싶습니다.
내가 Erlang R14B를 set
테이블과 함께 사용하고 있지만, Erlang 버전이나 모든 유형의 테이블에주의 사항이 있는지 알고 싶습니다. 감사!
감사합니다. 매뉴얼 페이지의 * Concurrency * 섹션은 필자가 놓친 것입니다. 'safe_fixtable'을 사용하면 모든 객체가 한번 방문됩니다. 그리고 네, 제 실제 코드에서는 데이터를 "처리 완료"라고 표시하기 전에 데이터에 대해 복잡한 처리를하고 있습니다 : 삭제. 건배! – JasonSmith