CsvProvider 抛出 OutOfMemoryException

CsvProvider throws OutOfMemoryException

FAOCropsLivestock.csv 包含超过 1400 万行。在我的 .fs 文件中,我声明了

type FAO = CsvProvider<"c:\FAOCropsLivestock.csv">

并尝试使用以下代码

FAO.GetSample().Rows.Where(fun x -> x.Country = country) |> ....
FAO.GetSample().Filter(fun x -> x.Country = country) |> ....

在这两种情况下,都抛出了 exception

在 MSSQL Server

中加载 csv 文件后,我也尝试使用以下代码
type Schema = SqlDataConnection<conStr>
let db = Schema.GetDataContext()
db.FAOCropsLivestock.Where(fun x-> x.Country = country) |> ....

有效。如果我使用 OleDb 连接发出 query,它也可以工作,但速度很慢。

如何使用 CsvProvider 从中获取序列?

如果您参考 CSV Type Provider documentation 的底部,您将看到有关处理大型数据集的部分。如此处所述,您可以设置 CacheRows = false,这将在处理大型数据集时为您提供帮助。

type FAO = CsvProvider<"c:\FAOCropsLivestock.csv", CacheRows = false>

然后您可以将 CSV 的行作为一个序列使用标准序列操作,而无需将整个文件加载到内存中。例如

FAO.GetSample().Rows |> Seq.filter (fun x -> x.Country = country) |> ....

但是,您应该注意只枚举一次内容。