我需要使用ets和dets从一个1GB的XML文件中提取一些数据到<key,value>表中。我已经搜索了整个网站,也在这里,但我没有找到任何简单的例子,就如何处理大XML文件。首先,我只想了解如何读取文件,而不将整个文件上传到内存中。
<key,value>
js81xvg61#
拜托!你需要的是一个叫埃尔森的人。对于小文件,可以将其全部加载到内存中,然后解析它,就像我给这个question的answer一样。但是,对于您的情况,这些大文件需要SAX方法。萨克斯的例子在这里。SAX确保您不会将文件加载到内存中进行解析。解析器得到的标记就是它给你的标记。你需要掌握尾递归、模式匹配和有状态编程的高级技能。
编辑
现在,download erlsom,并将其提取到erlang lib中,所有内置应用程序都位于该位置。将其解压缩文件夹如下所示:erlsom-1.0。创建一个名为:erlsom-1.0文件夹中的Emakefile。把这个放进文件里保存。
lib
erlsom-1.0
Emakefile
{"src/*", [verbose,report,warn_obsolete_guard,{outdir, "ebin"}]}.
erlsom-1.0文件夹应该如下所示:
erlsom-1.0 |-doc/ |-ebin/ |-examples/ |-include/ |-src/ |-Emakefile
其他文件的其余部分无关紧要。现在,打开一个erlang shell,其pwd()正在查找erlsom-1.0文件夹。运行函数:make:all().像这样
pwd()
make:all().
Eshell V5.9 (abort with ^G) 1> make:all(). Recompile: src/ucs Recompile: src/erlsom_writeHrl Recompile: src/erlsom_write Recompile: src/erlsom_ucs Recompile: src/erlsom_simple_form Recompile: src/erlsom_sax_utf8 Recompile: src/erlsom_sax_utf16le Recompile: src/erlsom_sax_utf16be Recompile: src/erlsom_sax_list Recompile: src/erlsom_sax_lib Recompile: src/erlsom_sax_latin1 Recompile: src/erlsom_sax Recompile: src/erlsom_pass2 Recompile: src/erlsom_parseXsd Recompile: src/erlsom_parse Recompile: src/erlsom_lib Recompile: src/erlsom_compile Recompile: src/erlsom_add Recompile: src/erlsom up_to_date 2>
所以,它完成了。因此,如果文件夹erlsom-1.0在您的erlang lib中,那么您可以从任何erlang shell调用erlsom方法,无论它可能具有pwd()。
8zzbczxx2#
你看过xmerl library吗?
ehxuflar3#
为了阅读大文件,而不是将其完全加载到内存中,你可以使用file:open/2,这样做:
{ok, FileHandler} = file:open(File, [read, raw, read_ahead]), {ok, Line} = file:read_line(FileHandler)
此外,对于XML,在Erlang中有xmerl,不幸的是,它的文档非常少。
q35jwt9p4#
我不知道Erlang,但似乎可以集成C库。如果你愿意走这条路,我可以推荐你看看expat库。它是我所知道的快速、轻量级的xml解析器库。一个简单的回调机制调用每个xml元素的代码,您可以自己决定是否要将其保留在内存中,或者是否要跳过它。我知道这很低级但对于非常大的数据,可悲的是,这通常是唯一的方法。以下是我在Google上找到的东西:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html
4条答案
按热度按时间js81xvg61#
拜托!你需要的是一个叫埃尔森的人。对于小文件,可以将其全部加载到内存中,然后解析它,就像我给这个question的answer一样。但是,对于您的情况,这些大文件需要SAX方法。萨克斯的例子在这里。
SAX确保您不会将文件加载到内存中进行解析。解析器得到的标记就是它给你的标记。你需要掌握尾递归、模式匹配和有状态编程的高级技能。
编辑
现在,download erlsom,并将其提取到erlang
lib
中,所有内置应用程序都位于该位置。将其解压缩文件夹如下所示:erlsom-1.0
。创建一个名为:erlsom-1.0
文件夹中的Emakefile
。把这个放进文件里保存。erlsom-1.0文件夹应该如下所示:
其他文件的其余部分无关紧要。现在,打开一个erlang shell,其
pwd()
正在查找erlsom-1.0
文件夹。运行函数:make:all().
像这样所以,它完成了。因此,如果文件夹
erlsom-1.0
在您的erlanglib
中,那么您可以从任何erlang shell调用erlsom方法,无论它可能具有pwd()
。8zzbczxx2#
你看过xmerl library吗?
ehxuflar3#
为了阅读大文件,而不是将其完全加载到内存中,你可以使用file:open/2,这样做:
此外,对于XML,在Erlang中有xmerl,不幸的是,它的文档非常少。
q35jwt9p4#
我不知道Erlang,但似乎可以集成C库。如果你愿意走这条路,我可以推荐你看看expat库。它是我所知道的快速、轻量级的xml解析器库。一个简单的回调机制调用每个xml元素的代码,您可以自己决定是否要将其保留在内存中,或者是否要跳过它。
我知道这很低级但对于非常大的数据,可悲的是,这通常是唯一的方法。
以下是我在Google上找到的东西:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html