2

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

谢谢。

4

4 回答 4

3

来吧 !您需要的是一个名为Erlsom的SAX XML 解析器。对于小文件,可以将其全部加载到内存中,然后按照我对这个问题的回答进行解析。但是,对于您的情况,这些大文件需要 SAX 方法。萨克斯的例子在这里。SAX 确保您不会将文件加载到内存中来解析它。解析器得到的令牌就是它给你的。您将需要尾递归、模式匹配和有状态编程的高级技能。编辑




现在,下载 erlsom并将其解压缩到您的 erlanglib中,这是所有内置应用程序所在的位置。像这样重命名其提取文件夹:erlsom-1.0. 在文件夹中创建一个名为:Emakefileerlsom-1.0文件。将其放入该文件并保存。
{“src/*”,[详细,报告,warn_obsolete_guard,{outdir,“ebin”}]}。
erlsom-1.0 文件夹应如下所示:
erlsom-1.0 
|-doc/
|-ebin/
|-examples/
|-include/
|-src/
|-Emakefile
其他文件的其余部分无关紧要。现在,打开一个pwd()正在查看erlsom-1.0文件夹的 erlang shell。运行函数:make:all().像这样
Eshell V5.9(使用 ^G 中止)
1> 制作:全部()。
重新编译:src/ucs
重新编译:src/erlsom_writeHrl
重新编译:src/erlsom_write
重新编译:src/erlsom_ucs
重新编译:src/erlsom_simple_form
重新编译:src/erlsom_sax_utf8
重新编译:src/erlsom_sax_utf16le
重新编译:src/erlsom_sax_utf16be
重新编译:src/erlsom_sax_list
重新编译:src/erlsom_sax_lib
重新编译:src/erlsom_sax_latin1
重新编译:src/erlsom_sax
重新编译:src/erlsom_pass2
重新编译:src/erlsom_parseXsd
重新编译:src/erlsom_parse
重新编译:src/erlsom_lib
重新编译:src/erlsom_compile
重新编译:src/erlsom_add
重新编译:src/erlsom
最新
2>
所以,它完成了。因此,如果该文件夹erlsom-1.0在您的 erlanglib中,那么您可以从任何 erlang shell 中调用 erlsom 方法,无论pwd()它可能有。

于 2012-07-30T08:33:03.993 回答
0

你检查过xmerl 库吗?

于 2012-07-29T14:31:18.477 回答
0

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

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

此外,为了使用 XML,在 Erlang 中你有 xmerl,不幸的是,它的文档记录很差。

于 2012-07-30T07:27:46.773 回答
-1

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

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

这是我在谷歌上找到的东西:http: //dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html

于 2012-07-29T14:21:06.083 回答