Edited at

Elixirで使用できるアトムの上限

More than 3 years have passed since last update.

すごいE本を読んでいてErlangではアトムの数が制限されていて(公式ドキュメントによるとデフォルトで1,048,576)、しかもガーベジコレクトされないので、アプリケーションの中で動的にアトムを生成するようなことは避けるべきと書いてありました。

これがElixirにも当てはまるのかどうか検証をしてみたところ、以下のように100万をちょっと超えたところでクラッシュしてしまいました。1万程度はすでに使われていると想定するとElixirもErlangに準じていると思われます。

ElixirでKey-Valueストアを自作するような時は注意したほうがよさそうですね。

#!/usr/bin/env elixir

for a <- 0..9,
b <- 0..9,
c <- 0..9,
d <- 0..9,
e <- 0..9,
f <- 0..9,
g <- 0..9
do
val =
"a" <>
Integer.to_string(a) <>
Integer.to_string(b) <>
Integer.to_string(c) <>
Integer.to_string(d) <>
Integer.to_string(e) <>
Integer.to_string(f) <>
Integer.to_string(g)
IO.inspect val
String.to_atom(val)
end

$ ./lib/atom_limit.exs

"a0000000001"
"a0000000002"
"a0000000003"



"a0001037169"
"a0001037170"
"a0001037171"

Crash dump is being written to: erl_crash.dump...