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

时间:2012-07-29 13:55:20

标签: erlang

我需要使用将1 GB XML文件中的一些数据提取到表中 ets和dets。 我搜索整个网络,也在这里,但我没有找到任何简单的例子 关于如何处理大型XML文件。 首先,我只想了解如何在不将整个文件上传到内存中的情况下阅读文件。

日Thnx。

4 个答案:

答案 0 :(得分:3)

来吧!您需要的是名为SAX XML parserErlsom。对于小文件,可以将其全部加载到内存中,然后像我在answer中给出的question一样解析它。但是,对于您的情况,这些大文件需要SAX方法。 Sax示例是here

SAX确保您不会将文件加载到内存中来解析它。解析器获得的标记就是它给你的东西。您将需要尾递归,模式匹配和有状态编程的高级技能。

编辑


现在,download erlsom和提取它进入你的erlang lib,这是所有内置应用程序所在的位置。重命名其提取文件夹,如下所示:erlsom-1.0。在Emakefile文件夹中创建名为erlsom-1.0的文件。把它放在那个文件里并保存。
{"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文件夹。像这样
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>
运行功能:make:all(). 所以,它完成了。因此,如果文件夹erlsom-1.0位于您的erlang lib中,那么您可以从任何可能具有pwd()的erlang shell调用erlsom方法。

答案 1 :(得分:0)

您检查了xmerl library吗?

答案 2 :(得分:0)

为了阅读大文件而不将其完全加载到内存中,您可以使用file:open/2,执行以下操作:

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

另外,对于使用XML,在Erlang中你有xmerl,遗憾的是,它很难记录。

答案 3 :(得分:-1)

我不知道Erlang,但似乎可以集成C库。如果您愿意走这条路,我建议您查看expat库。它是我所知道的快速,轻量级的xml解析器库。一个简单的回调机制调用每个xml元素的代码,您可以自己决定是将它保留在内存中还是想要跳过它。

我知道,这是非常低级的。但是对于非常大的数据,遗憾的是,这通常是唯一的方法。

以下是我发现谷歌搜索的内容:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html