将1GB XML文件转换为Erlang中的ets和dets

00jrzges  于 2023-09-28  发布在  Erlang
关注(0)|答案(4)|浏览(161)

我需要使用ets和dets从一个1GB的XML文件中提取一些数据到<key,value>表中。我已经搜索了整个网站,也在这里,但我没有找到任何简单的例子,就如何处理大XML文件。
首先,我只想了解如何读取文件,而不将整个文件上传到内存中。

js81xvg6

js81xvg61#

拜托!你需要的是一个叫埃尔森的人。对于小文件,可以将其全部加载到内存中,然后解析它,就像我给这个questionanswer一样。但是,对于您的情况,这些大文件需要SAX方法。萨克斯的例子在这里。
SAX确保您不会将文件加载到内存中进行解析。解析器得到的标记就是它给你的标记。你需要掌握尾递归、模式匹配和有状态编程的高级技能。

编辑

现在,download erlsom,并将其提取到erlang lib中,所有内置应用程序都位于该位置。将其解压缩文件夹如下所示:erlsom-1.0。创建一个名为: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().像这样

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()

ehxuflar

ehxuflar3#

为了阅读大文件,而不是将其完全加载到内存中,你可以使用file:open/2,这样做:

{ok, FileHandler} = file:open(File, [read, raw, read_ahead]),
 {ok, Line} = file:read_line(FileHandler)

此外,对于XML,在Erlang中有xmerl,不幸的是,它的文档非常少。

q35jwt9p

q35jwt9p4#

我不知道Erlang,但似乎可以集成C库。如果你愿意走这条路,我可以推荐你看看expat库。它是我所知道的快速、轻量级的xml解析器库。一个简单的回调机制调用每个xml元素的代码,您可以自己决定是否要将其保留在内存中,或者是否要跳过它。
我知道这很低级但对于非常大的数据,可悲的是,这通常是唯一的方法。
以下是我在Google上找到的东西:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html

相关问题