Powered by AppSignal & Oban Pro

elixir

elixir.livemd

elixir

Section

defmodule Parse do
  def parse_lines(lines) do
    for line <- lines do
      parsed_line = parse_line(line)
    end
  end
  
  def parse_line(line) do
    [datetime, type, value, id, name, coords] = line |> String.split(";")
    [date, time] = datetime |> String.split("T")
    time = time |> String.slice(0, 8)
    %{:id => id,
      pollutionLevel: value |> String.to_float(),
      coords: coords 
        |> String.split(",")
        |> Enum.map(&String.to_float/1)
        |> List.to_tuple(),
      pollutionType: type,
      stationName: name,
      datetime: { 
        date |> String.split("-") |> Enum.map(&String.to_integer/1) |> List.to_tuple(),
        time |> String.split(":") |> Enum.map(&String.to_integer/1) |> List.to_tuple()  
      }
    }
  end
end

all_stations = File.read!("C:\\Users\\xpfk0\\studia\\AirlyData-ALL-50k.csv")
|> String.split("\n")
|> Enum.map(&Parse.parse_line/1)

unique_stations = all_stations |> Enum.uniq_by(& &1.id)
# Code.append_path("C:\\Users\\xpfk0\\studia\\erlang\\erlll\\_build\\default\\lib\\erlll\\ebin")
Code.append_path("C:\\Users\\xpfk0\\studia\\erlang\\pollution_app\\_build\\default\\lib\\pollution_app\\ebin")
Application.start(:pollution_app)
Application.stop(:pollution_app)
res = (fn -> (for station <- unique_stations do 
  :pollution_gen_server.add_station("#{station.id}: #{station.stationName}", station.coords)
end) end |> :timer.tc |> elem(0))
IO.inspect(res / 1000000)
res = (fn -> (
  Enum.with_index(all_stations)
  |> Enum.each(fn {station, i} -> 
      :pollution_gen_server.add_value(station.coords, station.datetime, station.pollutionType, station.pollutionLevel)
      # if rem(i, 1000) == 0 do IO.puts("Dodano #{i} stacji") end
    end)

  
) end |> :timer.tc |> elem(0))
IO.inspect(res / 1000000)
IO.inspect(:pollution_gen_server.get_station_min("9910: Polska, Kraków, Studencka", "PM10"))
time = (fn -> :pollution_gen_server.get_station_min("9910: Polska, Kraków, Studencka", "PM10") end |> :timer.tc |> elem(0)) / 1000000
IO.inspect(time)
IO.inspect(:pollution_gen_server.get_daily_mean("PM25", {2024, 2, 10}))
time = (fn -> :pollution_gen_server.get_daily_mean("PM25", {2024, 2, 10}) end |> :timer.tc |> elem(0)) / 1000000
IO.inspect(time)