使用F#数据CSV类型提供程序与CSV解析器和读取器之间的性能差异

4
我正在使用ExcelDNA编写一个F#插件UDF,理想情况下,我希望根据另一个CSV文件的内容动态加载CSV文件。 我一直在使用以下F# Data库中的类型提供程序和CSV解析器:http://fsharp.github.io/FSharp.Data/library/CsvProvider.html。由于它不是静态的,类型提供程序不允许我在编译之前将变量作为字符串传递(也许我做错了什么-请参见下面不起作用的代码)。
let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">()
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |]


let onstructure = new CsvProvider<closescc.[0], ",">()

无效的静态参数,期望一个“字符串”类型的参数。
但是,如果我使用相同库中的CSV解析器,它可以工作(但是我会失去提供程序的强类型方面)。
let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">()
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |]

let onstructure = CsvFile.Load(closescc.[0]).Cache()

我想知道的是:
由于这将在Excel中被多次调用,如果使用CsvParse方法与CSV类型提供程序相比存在显着的性能损失,特别是如果我需要在csvparse方法中进行任何转换/强制转换。

请注意,每次计算我需要加载大约4个csv文件,这些csv文件大约有600-2000行。 我现阶段无法选择去数据库。

谢谢。


为什么不试一下呢?另外,我认为你想让其中一个代码块不同。 - John Palmer
我不确定CSV类型提供程序是如何工作的,但在SqlEntityConnection(数据库提供程序)的情况下,确实需要一个连接字符串来创建类型,但随后可以在创建上下文时提供不同的连接字符串作为参数。只要两个数据库相同,它就能很好地工作。CSV提供程序中没有这样的选项吗? - Patryk Ćwiek
1个回答

3
您传递给CsvProvider的静态字符串参数是用于推断架构的模板,但您可以在运行时使用不同的值。因此,不要写成这样:
let sample = new CsvProvider<"Sample.csv">()

请执行以下操作:

let csv = CsvProvider<"Sample.csv">.Load("runtimeLocation.csv")

或者这个:
type CsvType = CsvProvider<"Sample.csv">
let csv = CsvType.Load("runtimeLocation.csv")

就性能而言,CsvProvider在内部使用相同的csv解析器,因此CsvFile应具有类似的性能特征,区别仅在于强类型化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接