CsvProvider抛出OutOfMemoryException

时间:2016-11-28 19:40:32

标签: f# f#-data

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) |> ....

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

如何使用CsvProvider来获取序列?

1 个答案:

答案 0 :(得分:6)

如果您参考CSV Type Provider documentation的底部,您将看到有关处理大型数据集的部分。正如那里所解释的那样,您可以设置CacheRows = false,这将有助于您处理大型数据集。

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

然后,您可以将CSV行上的标准序列操作用作序列,而无需将整个文件加载到内存中。 e.g。

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

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