CsvProvider抛出OutOfMemoryException

Emo*_*que 2 f# f#-data

FAOCropsLivestock.csv包含超过1400万行.在我的.fs档案中,我宣布了

type FAO = CsvProvider<"c:\FAOCropsLivestock.csv">
Run Code Online (Sandbox Code Playgroud)

并尝试使用以下代码

FAO.GetSample().Rows.Where(fun x -> x.Country = country) |> ....
FAO.GetSample().Filter(fun x -> x.Country = country) |> ....
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,都exception被扔了.

csv在MSSQL Server中加载文件后,我也试过了下面的代码

type Schema = SqlDataConnection<conStr>
let db = Schema.GetDataContext()
db.FAOCropsLivestock.Where(fun x-> x.Country = country) |> ....
Run Code Online (Sandbox Code Playgroud)

有用.如果我query使用OleDb连接发出它也有效,但它很慢.

如何使用它来获取顺序CsvProvider

The*_*ght 6

如果您参考CSV类型提供程序文档的底部,您将看到有关处理大型数据集的部分.正如那里所解释的那样,您可以设置CacheRows = false哪些可以帮助您处理大型数据集.

type FAO = CsvProvider<"c:\FAOCropsLivestock.csv", CacheRows = false>
Run Code Online (Sandbox Code Playgroud)

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

FAO.GetSample().Rows |> Seq.filter (fun x -> x.Country = country) |> ....
Run Code Online (Sandbox Code Playgroud)

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

  • 它比`OleDb`慢3倍,每列测试`DBNull.Value`.它的速度有多慢并不重要!它用较少的代码工作正常....谢谢. (2认同)