Versión corta: ¿es seguro usar ets:foldl
para eliminar todos los registros ETS mientras se está iterando a través de ellos?Usando ets: foldl como pobre para cada uno de cada registro
Supongamos que una tabla ETS está acumulando información y ahora es el momento de procesarla. Se lee un registro de la tabla, se usa de alguna forma y luego se borra. (Además, suponga que la tabla es private
, por lo que no hay problemas de concurrencia.)
En otro idioma, con una estructura de datos similar, puede usar un para ... cada bucle, procesar cada registro y luego eliminarlo del hash/dict/map/lo que sea. Sin embargo, el módulo ets
no tiene foreach
, como p. lists
hace.
Pero esto podría funcionar:
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).
[]
Es este el enfoque preferido? ¿Es al menos correcto y libre de errores?
Tengo una preocupación general sobre la modificación de una estructura de datos durante el procesamiento, sin embargo, el ets:foldl documentation implica que ETS está bastante cómodo con usted modificando registros dentro de foldl
. Como esencialmente estoy limpiando la mesa, quiero estar seguro.
Estoy usando Erlang R14B con una tabla set
, pero me gustaría saber si hay advertencias con cualquier versión de Erlang, o cualquier tipo de tabla también. ¡Gracias!
Gracias. La sección * Concurrencia * de la página de manual es exactamente lo que me perdí. Claramente dice que si usas 'safe_fixtable' entonces cada objeto se visita una vez. Y sí, en mi código real estoy, por supuesto, haciendo un procesamiento complejo de los datos antes de marcarlo esencialmente como "hecho" a través de ets: eliminar. ¡Aclamaciones! – JasonSmith