来自FSharp.Data的CSV typeprovider的性能问题

时间:2014-03-29 10:54:35

标签: csv f# type-providers f#-3.0 f#-data

我试图通过使用它来读取CSV文件来了解有关FSharp.Data项目的更多信息。 CSV文件是Kaggle数字识别器竞赛数据的简化版本。

当我读取包含785列和113行(包括标题行)的CSV文件时,以下两行代码执行速度非常慢:

type trainingSet = CsvProvider<"Data/trainSmall.csv", ",", CacheRows=false>
let data = trainingSet.Load("Data/trainSmall.csv")

当我将第一行发送到F#interactive时,它会在大约10秒内返回,而当我将第二行代码发送到F#interactive时,在交互式提示回复之前需要超过5分钟。

我使用F#3.0和Xamarin Studio在2013年使用2.6 GHz I5处理器和16GB内存在我的MacBook Pro上运行代码。我尝试了在同一硬件上在VM下运行的Windows7 / VS2013的相同实验。结果具有可比性。当我使用同一台机器并尝试用R做同样的事情时,它是如此之快,以至于我无法用普通手表计时。

请告诉我Fsharp.Data正确使用CSV typeprovider的建议!

2 个答案:

答案 0 :(得分:1)

我建议您不要使用CsvProvider。您正在加载矩阵,因此您无法获得推断每列的类型的任何好处,因为它们都是相同的。您仍然可以使用CsvFile来使用F#Data的CSV解析器。 CsvProvider针对列数不多但行可能很多的文件进行了优化。生成代码的方式将尝试在您的示例中生成一个包含785个元素的元组,这将无法正常工作

答案 1 :(得分:0)

嗯,第二行应该是什么都不做,因为行是按需读取的。那里有些问题,你能否在github上用repro文件提交问题?