gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:40:48 24 4
gpt4 key购买 nike

我正在使用 ExcelDNA 为 Excel 编写 F# 插件 UDF理想情况下,我想根据另一个 CSV 的内容动态加载 CSV。
我一直在下面的 F# 数据库中使用类型提供程序和 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 个 csvs,csvs 大约有 600-2000 行长。在这个阶段我没有选择去数据库。
谢谢你。

最佳答案

您传递给 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 应该具有相似的性能特征,不同之处在于强类型

关于f# - 使用 F# 数据 CSV 类型提供程序与 CSV 解析器和读取器之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21296951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com