输入提供程序和大XML文件

时间:2016-05-10 15:05:27

标签: xml f# type-providers

我想知道在F#中使用类型提供程序的好方法是什么,

我有一个XML文件(25Mo +),我认为这不会是一个问题,但我的Visual Studio遭受了很多损失。通常最好的做法是,用最少的数据定义XML的完整模板并稍后加载内容?

如果我们加载一个带有可选节点的大文件,那么该类型将由最完整的节点推断出来?

谢谢

2 个答案:

答案 0 :(得分:2)

XmlProvider类型提供程序基于XDocument(LINQ to XML),因此始终需要将文件读入内存。但是,模式推断可能会导致一些额外的开销,您可以避免这种开销。因此,如果LINQ to XML可以读取25MB文件(我不确定,请尝试在文件上使用XDocument.Load),那么您就可以使用类型提供程序。

假设big.xml是您的大文件,您可以尝试删除文件中的某些元素(以便所有结构都存在,但它更小)并创建small.xml。然后你可以使用:

type X = XmlProvider<"small.xml">
let data = X.Load("big.xml")

这只会在较小的文件(在Visual Studio的后台运行)上运行模式推断,然后它会尝试使用LINQ to XML读取更大的文件。这只是读取文件,所以如果LINQ to XML可以读取25MB文件,这将有效。

理想情况下,我们会对类型提供程序有一些变化,这些变体适用于XmlReader或类似的东西 - 这可能会重用一些F#数据基础结构,但它仍然需要做很多工作(打开{{ 3}}你对贡献感兴趣!)

答案 1 :(得分:0)

是的,XMLProvider存在(希望暂时)巨大的性能问题。 https://github.com/fsharp/FSharp.Data/issues/975

如果有人合并我的#983或#976 PR,他们将被修复。在此期间,您可以在https://github.com/Thorium/FSharp.Data

分叉并试用我的仓库副本