我一直在使用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秒似乎很高。我可以以某种方式缩短它吗?
答案 0 :(得分:3)
默认情况下,Frame.ReadCsv
函数会尝试通过查看内容来推断列的类型。我认为这可能会增加大部分开销。您可以尝试指定inferTypes=false
来完全禁用它(然后它会将数据作为字符串加载),或者您可以使用inferRows=10
来推断前几行中的类型。这应该足够好并且更快:
let df = Frame.ReadCsv(testfile, inferRows=10)
也许我们应该把这个作为默认选项。如果这不能解决问题,请提交GitHub问题,我们会对此进行调查!