我想知道在F#中使用类型提供程序的好方法是什么,
我有一个XML文件(25Mo +),我认为这不会是一个问题,但我的Visual Studio遭受了很多损失。通常最好的做法是,用最少的数据定义XML的完整模板并稍后加载内容?
如果我们加载一个带有可选节点的大文件,那么该类型将由最完整的节点推断出来?
谢谢
答案 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
分叉并试用我的仓库副本