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) |> ....
但是,您应该注意只枚举一次内容。
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) |> ....
但是,您应该注意只枚举一次内容。