F#Deedle的csv文件加载时间

时间:2014-05-19 12:31:59

标签: f# type-providers f#-interactive deedle

我一直在使用CSV提供程序加载大约300k到1M行(50~120megs)的文件。它运作良好,速度非常快。它可以在一秒钟内加载大多数文件。 这是Windows上64位FSI的输出,加载了大约400k行和25个字段的文件。

#time
let Csv2 = CsvFile.Parse(testfile)
let parsedRows = Csv2.Rows |> Seq.toArray
#time

--> Timing now on

Real: 00:00:00.056, CPU: 00:00:00.093, GC gen0: 0, gen1: 0, gen2: 0

但是当我将相同的文件加载到Deedle

#time
let dCsv = Frame.ReadCsv(testfile)
#time;;

--> Timing now on

Real: 00:01:39.197, CPU: 00:01:41.119, GC gen0: 6324, gen1: 417, gen2: 13

需要超过1分40秒。我知道有一些额外的时间是必要的,因为Deedle比上面的静态csv解析器做的更多,但超过1米40秒似乎很高。我可以以某种方式缩短它吗?

1 个答案:

答案 0 :(得分:3)

默认情况下,Frame.ReadCsv函数会尝试通过查看内容来推断列的类型。我认为这可能会增加大部分开销。您可以尝试指定inferTypes=false来完全禁用它(然后它会将数据作为字符串加载),或者您可以使用inferRows=10来推断前几行中的类型。这应该足够好并且更快:

let df = Frame.ReadCsv(testfile, inferRows=10)

也许我们应该把这个作为默认选项。如果这不能解决问题,请提交GitHub问题,我们会对此进行调查!