我需要使用 ets 和 dets 从 1 GB XML 文件中提取一些数据到表中。我搜索了整个网络,也在这里搜索,但我没有找到任何关于如何处理大 XML 文件的简单示例。一开始我只想了解如何在不将整个文件上传到内存的情况下读取文件。
谢谢。
我需要使用 ets 和 dets 从 1 GB XML 文件中提取一些数据到表中。我搜索了整个网络,也在这里搜索,但我没有找到任何关于如何处理大 XML 文件的简单示例。一开始我只想了解如何在不将整个文件上传到内存的情况下读取文件。
谢谢。
来吧 !您需要的是一个名为Erlsom的SAX XML 解析器。对于小文件,可以将其全部加载到内存中,然后按照我对这个问题的回答进行解析。但是,对于您的情况,这些大文件需要 SAX 方法。萨克斯的例子在这里。SAX 确保您不会将文件加载到内存中来解析它。解析器得到的令牌就是它给你的。您将需要尾递归、模式匹配和有状态编程的高级技能。编辑
lib
中,这是所有内置应用程序所在的位置。像这样重命名其提取文件夹:erlsom-1.0
. 在文件夹中创建一个名为:Emakefile
的erlsom-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()
它可能有。
你检查过xmerl 库吗?
要读取大文件而不将其完全加载到内存中,您可以使用file:open/2,执行以下操作:
{ok, FileHandler} = file:open(File, [read, raw, read_ahead]),
{ok, Line} = file:read_line(FileHandler)
此外,为了使用 XML,在 Erlang 中你有 xmerl,不幸的是,它的文档记录很差。
我不知道Erlang,但似乎可以集成C库。如果你愿意走这条路,我可以建议你看看expat库。这是我所知道的快速、轻量级的 xml 解析器库。一个简单的回调机制调用您的每个 xml 元素的代码,您可以自己决定是将它保留在内存中还是跳过它。
我知道,这是非常低级的。但遗憾的是,对于非常大的数据,这通常是唯一的方法。
这是我在谷歌上找到的东西:http: //dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html