2016-05-10 40 views
0

我想知道什么是在使用F#类型提供了良好做法,类提供商和大型XML文件

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

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

感谢

+1

上分叉并尝试购买我的回购副本。对于大型的XML文件,最好不要使用任何将整个内容加载到内存中的工具。 'XmlReader'可能是要走的路,因为它允许您在任何给定时间选择性地只加载您实际需要的文档部分。 –

+0

谢谢@JoelMueller我知道他们是一个大小限制,但我没有想到,一个25莫将已经太大了:( – rad

+0

一个类似的问题之前几个小时问了这个:http://stackoverflow.com/ q/37135965/126014这是功课吗? –

回答

2

XmlProvider类提供商是基于XDocument(LINQ到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#数据基础架构,但它仍然会很多工作(打开issue at F# Data有兴趣贡献!)