【发布时间】:2020-09-02 18:55:44
【问题描述】:
我正在 Elixir 中编写一个简单的模块,它将数据加载到用 Erlang 编写的 gen_server 中。我需要测量加载操作的时间,这是我遇到的问题。当我在第 46 行(带有 crateStations 的那个)上调用 :timer.tc() 时,我得到 SystemLimitError,我不知道是什么导致了这种行为,如果有任何提示,我将不胜感激。 Bellow 是使用的 elxir 模块的代码,我之前使用过 Erlang gen_server 并且没有发生此类错误。
defmodule Data do
defp nameStation({:cords,lat,lang}) do
"station_#{lang}_#{lat}}}"
end
defp identifyStations(data) do
data |> Enum.map((&(&1.location))) |> Enum.uniq |> Enum.map((fn({lat,lang})->{:cords,lat,lang}end))
end
defp createStations(data)do
identifyStations(data) |>
Enum.each((fn (cords)->:pollution_gen_server.addStation(nameStation(cords),cords) end))
end
defp createMesurements(data) do
data |> Enum.each((fn(value)->
:pollution_gen_server.addValue(value.location,value.datetime,"PM10",value.pollutionLevel ) end))
end
defp importLinesFromCSV(path) do
File.read!(path) |> (&(String.split(&1, "\r\n"))).()
end
defp parse(line) do
[date_l,time_l,lang_l,lat_l,polltion_l] = String.split(line,",")
lat = lat_l |> Float.parse() |> elem(0)
lang = lang_l |> Float.parse() |> elem(0)
pollution = polltion_l |> Integer.parse() |> elem(0)
{hours,mins} = time_l |> String.split(":") |> Enum.map(&(Integer.parse/1)) |>Enum.map(&(elem(&1,0))) |>
:erlang.list_to_tuple()
date = date_l |> String.split(":") |> Enum.map(&(Integer.parse/1)) |> Enum.reverse() |>Enum.map(&(elem(&1,0))) |>
:erlang.list_to_tuple()
%{
:datetime => {date,{hours,mins,0}},
:location => {lat,lang},
:pollutionLevel => pollution
}
end
def run(path) do
:pollution_sup.start_link()
lines = importLinesFromCSV(path) |> Enum.map(&parse/1)
time_stations = :timer.tc(&createStations/1,lines) |> elem(0) |> Kernel./(1_000_000)
time_measurements = :timer.tc(&createMesurements/1,lines) |> elem(0) |> Kernel./(1_000_000)
time_mean = :timer.tc(&:pollution_gen_server.getStationMean/2,["PM10",{:cords, 49.986, 20.06}]) |> elem(0) |> Kernel./(1_000_000)
mean = :pollution_gen_server.getStationMean("PM10",{:cords, 49.986, 20.06})
time_daily = :timer.tc(&:pollution_gen_server.getDailyMean/2,["PM10",{2017, 5, 3}]) |> elem(0) |> Kernel./(1_000_000)
daily = :pollution_gen_server.getDailyMean("PM10",{2017, 5, 3})
IO.puts "Time of loading stations: #{time_stations}"
IO.puts "Time of loading mesurements: #{time_measurements}"
IO.puts "Time of getting mean: #{time_mean} result: #{mean}"
IO.puts "Time of getting daily: #{time_daily} result: #{daily}"
end
end
【问题讨论】:
-
请提供 MCVE 并发布错误的堆栈跟踪。
-
系统限制错误表明已超出these limits 之一。大胆猜测:您是否启动了超过 262,144 个进程?
标签: erlang elixir erlang-otp erl