我知道使用该库读取一个非常大的csv文件比使用. 但是,只能对 执行操作。freaddata.tableread.csvdata.framedplyrdata.frame
我的问题是:
- 为什么
dplyr要使用这两种数据结构中较慢的一种? - 在处理大数据时,读取
data.table并转换data.frame为执行dplyr操作是一种好习惯吗? - 我还缺少另一种策略吗?
我知道使用该库读取一个非常大的csv文件比使用. 但是,只能对 执行操作。freaddata.tableread.csvdata.framedplyrdata.frame
我的问题是:
dplyr要使用这两种数据结构中较慢的一种?data.table并转换data.frame为执行dplyr操作是一种好习惯吗?data.tabledata.table::fread使用 dtplyr,然后使用 dtplyr 对data.table对象进行有效的 dplyr 操作。我使用 data.table 来处理内存中数 GB 和超过 10 亿行的数据集。我在 dplyr 上没有取得同样的成功。
此外,请注意 dtplyr 自述文件中的注释:
dtplyr 总是比 data.table 慢一点,因为它创建对象的副本而不是就地变异(这就是 dplyr 的理念)。目前,dtplyr 比裸 data.table 慢很多,因为这些方法不够聪明。我希望社区中感兴趣的 dplyr 和 data.table 用户能帮助我提高性能。
tidyverse 还包含readr用于读取文本文件的更快功能,例如read_csv(https://cran.r-project.org/web/packages/readr/README.html)。
您在这里混淆了两个问题,data.table 与 data.frame 的操作速度,以及读取此类数据。
我会冒险猜测read.csv并且read.table速度很慢,因为它会进行很多低效的猜测并且(默认情况下)尝试将字符串转换为因子。在处理大型数据集时,您应该总是更喜欢告诉例程它正在读取什么,而不是让它猜测。
最后,如果您正在处理非常大的数据集,假设您的数据是结构化的,那么在 Rcpp 等中实现的专用子例程可能会更可取。