1

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

#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

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

4

1 回答 1

3

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

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

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

于 2014-05-19T13:37:31.267 回答