Я читаю почтовые индексы из CSV-файла, беру эти данные и кеширую их с помощью ets.
Файл почтового индекса довольно большой (95 МБ), поскольку в нем содержится около 1,8 миллиона записей.
Я кеширую только те почтовые индексы, которые необходимы для поиска в данный момент (около 200 КБ), поэтому объем данных, хранящихся в ets, не должен быть проблемой. Однако независимо от того, насколько мало количество вставок в ets, объем памяти, занимаемый процессом, практически не изменяется. Кажется, не имеет значения, если я вставлю 1 строку или все 1,8 млн.
# not logging all functions defs so it is not too long.
# Comment if more into is needed.
defmodule PostcodeCache do
use GenServer
def cache_postcodes do
"path_to_postcode.csv"
|> File.read!()
|> function_to_parse()
|> function_to_filter()
|> function_to_format()
|> Enum.map(&(:ets.insert_new(:cache, &1)))
end
end
Я запускаю это в терминале с iex -S mix
и запускаю команду :observer.start
. Когда я перехожу на вкладку процессов, моя память postcodeCache становится большой (более 600 МБ)
Даже если я отфильтрую файл, чтобы в итоге я сохранил только один почтовый индекс в :ets
, он все равно будет превышать 600 МБ.