Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks 需要帮助修复elixir和sweet_xml库的内存泄漏吗_Memory Leaks_Elixir_Openstreetmap - Fatal编程技术网

Memory leaks 需要帮助修复elixir和sweet_xml库的内存泄漏吗

Memory leaks 需要帮助修复elixir和sweet_xml库的内存泄漏吗,memory-leaks,elixir,openstreetmap,Memory Leaks,Elixir,Openstreetmap,我是长生不老药的新手 我有以下lib/osm.ex文件 defmodule Osm.MixProject do use Mix.Project def project do [ app: :osm, version: "0.1.0", elixir: "~> 1.7", start_permanent: Mix.env() == :prod, escript: [main_module: Osm],

我是长生不老药的新手

我有以下
lib/osm.ex
文件

defmodule Osm.MixProject do
  use Mix.Project

  def project do
    [
      app: :osm,
      version: "0.1.0",
      elixir: "~> 1.7",
      start_permanent: Mix.env() == :prod,
      escript: [main_module: Osm],
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    [
      {:sweet_xml, github: 'kbrw/sweet_xml', app: false}
    ]
  end
end
defmodule Osm do
导入SweetXml
你好吗
:世界
结束
def主(args)do
args |>解析| args |>进程
结束
defp parse_args(args)do
{options,{,}=OptionParser.parse(参数,开关:[osm_文件::字符串,帮助::布尔])
选择权
结束
def output_help()do
IO.puts“用法:osm[选项]”
IO.puts“”
IO.puts“-osm文件要导入的osm文件”
IO.puts”--帮助输出此帮助页
结束
def进程([])do
IO.puts“未给出任何参数”
结束
def流程(选项)do
如果选项[:help]执行
输出_帮助()
其他的
案例选项是什么
[osm_文件:u]->
处理osm文件(选项[:osm文件])
结束
结束
结束
def process_osm_文件(文件)do
计数=%{:节点=>0,:方式=>0,:关系=>0}
康多
字符串。以?(文件“.pbf”)结尾\u->
IO.puts“解析osm pbf。”
字符串。以?(文件“.osm.bz2”)结尾\u->
IO.puts“提取并解析osm xml。”
字符串。以?(文件“.osm”)结尾\u->
IO.puts“解析osm xml”
File.stream!(档案)
|>流_标记([:节点,:方式,:关系],放弃:[:节点,:方式,:关系])
|>流图(fn)
{{,node}->
过程元素(节点、计数)
(完)
|>Enum.reduce(fn元素,结果->
结果_修改=%{result|
节点:结果[:节点]+元素[:节点],
方式:结果[:方式]+元素[:方式],
关系:结果[:关系]+元素[:关系]
}
康多
rem(结果_修改[:节点],1000)==0->
IO.write“\r节点:“到字符串(结果修改[:节点])”;方式:“到字符串(结果修改[:方式])”;关系:“到字符串(结果修改[:关系])”;内存:“到字符串(:erlang.memory(:total))
真->真
结束
结果被修改
(完)
|>Stream.run
IO.puts“”
正确->
IO.puts“osm文件扩展名无效。”
结束
结束
defp过程元素(单据、计数)do
case doc |>xmlement(:name)do
:节点->
doc |>xmap(
id:~x“/@id”i,
拉特:~x./@lat“f,
龙:~x./@lon”f,
标签:[
~x.“/标记”l,
钥匙:~x“/@k”s,
值:~x“/@v”s
]
)|>进程节点(计数)
:方式->
doc |>xmap(
id:~x“/@id”i,
nd:[
~x.“/nd”我,
ref:~x“/@ref”i
],
标签:[
~x.“/标记”l,
钥匙:~x“/@k”s,
值:~x“/@v”s
]
)|>处理方式(计数)
:关系->
doc |>xmap(
id:~x“/@id”i,
成员:[
~x.“/成员”l,
类型:~x“/@type”s,
参考号:~x“/@ref”s,
角色:~x“/@role”s
],
标签:[
~x.“/标记”l,
钥匙:~x“/@k”s,
值:~x“/@v”s
]
)|>过程关系(计数)
_ ->
IO.puts“未处理的元素”
结束
结束
defp进程_节点(节点,计数)do
_=节点
Map.put(计数,:节点,计数[:节点]+1)
结束
defp处理方式(方式、计数)do
_=方式
地图放置(计数,:方式,计数[:方式]+1)
结束
defp过程关系(关系、计数)do
_=关系
Map.put(计数,:关系,计数[:关系]+1)
结束
结束
以及下面的
mix.exs
文件

defmodule Osm.MixProject do
  use Mix.Project

  def project do
    [
      app: :osm,
      version: "0.1.0",
      elixir: "~> 1.7",
      start_permanent: Mix.env() == :prod,
      escript: [main_module: Osm],
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    [
      {:sweet_xml, github: 'kbrw/sweet_xml', app: false}
    ]
  end
end
我用
mixe-escript.build

我已经下载了berlin-latest.osm.bz2并提取了berlin-latest.osm文件

如果我调用
/osm--osm file=berlin latest.osm

脚本解析xml数据并正确计算节点、方式和关系,但内存消耗一直在增加,直到最后


SweetXml库中是否存在内存泄漏,或者我是否做错了什么?

我没有发现会在代码中造成内存泄漏的内容。

我做了以下测试:我使用SweetXml逐步删除了所有代码,当我使用SweetXml(即:
stream_标记([:node,:way,:relation],discard:[:node,:way,:relation])提取第一部分时,内存泄漏消失了这清楚地表明内存消耗来自SweetXml

阅读函数的源代码,可能会给你一些答案。我还不知道泄漏是从哪里来的


编辑:在彻底检查了源代码之后,我仍然没有找到泄漏的根源。我开始觉得这是更深层的东西,可能与erlang VM的工作方式有关。

我已经安装了您的项目并重现了这个问题:在解析过程中,消耗了越来越多的内存,而我们只计算出现的次数->我重现了内存泄漏。您随后产生了数十亿的
%SweetXpath{}
structs并将其映射到数十亿张您自己的地图。为什么您希望内存不会增长?但在执行@mudasobwa函数后,不会存储或保留任何内容,因此您是否暗示erlang vm不会在该函数执行后释放函数内部创建的数据占用的内存?还是内存被占用的速度快于释放的速度?作为一名经验丰富的erlang开发人员,您的投入将不胜感激。您正在导入日志,您的日志是否在增长?不,日志没有增长,我还没有使用任何日志记录。即使我不导入日志记录,内存仍在增长。谢谢,我想我会在SweetXMLGitHub存储库上打开一个问题。如果泄漏来自VM,我真的没有erlang/elixir的经验。SweetXml的几个主要贡献者在我的公司工作(包括CTO)。依赖