对上述答案的一些改进。使用 lapply() 代替 for 循环,使用 data.table::fread() 代替 read.table()。
For 循环与 lapply
有据可查的是,如果可能的话,应该使用 lapply 而不是 for 循环。一个快速的谷歌搜索将显示大量的论点和例子。 lapply 更快,它返回一个列表而不是必须定义一个列表(或其他存储对象),并且它可以很容易地并行运行,因为循环的每次迭代都是一个独立的函数调用,而不是“顶部的循环”等级。”在这种情况下,切换到 lapply 可以节省 7 秒(这相当微不足道,但最好养成好习惯)。
read.csv() 与 data.table::fread()
fread() 是对 read.csv() 的主要速度改进(我已经看到了 2-5 倍的加速,具体取决于数据等。here 是一篇文章,显示了大约 15 倍的加速),它旨在处理一些管理任务,例如猜测分隔符。在这种情况下,将 fread() 替换为 read.csv() 时有 15 秒的加速
> # Libraries and options ---------------------------------------------------
>
> library(dplyr)
> library(data.table)
> # Helper parameters -------------------------------------------------------
>
> out_dir = "C:/Users/taylor/Dropbox/R_programming/stackoverflow/data"
> obs = 5e5
> # Create test data --------------------------------------------------------
>
> test_df = data_frame(
+ x = rnorm(obs),
+ y = 0.5 * obs + rnorm(length(x), 0, 0.25),
+ groups = rep(letters[1:5], length.out = length(x))
+ )
> # export
> write.csv(test_df, paste0(out_dir, "/test_df.csv"), row.names = F)
> # clean memory
> rm(test_df)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 596408 31.9 1907703 101.9 10636178 568.1
Vcells 9301642 71.0 27768113 211.9 218137457 1664.3
> # For loop and read.csv (read.table alias) -------------------------------------
>
> system.time({
+
+ for(i in 1:20){
+ df = read.csv(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_original_example_", i, ".csv"), row.names = F)
+ }
+
+ })
user system elapsed
130.28 2.70 148.60
> # Lapply and read.csv -----------------------------------------------------
>
> # clean memory
> rm(df, i)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 596411 31.9 2185242 116.8 10636178 568.1
Vcells 9301647 71.0 27768113 211.9 218137457 1664.3
> system.time({
+
+ lapply(1:20, function(i){
+ df = read.csv(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_lapply_", i, ".csv"), row.names = F)
+ })
+
+ })
user system elapsed
123.33 2.07 140.03
> # Lapply and fread() ------------------------------------------------------
>
> system.time({
+
+ lapply(1:20, function(i){
+ df = fread(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_lapply_fread_", i, ".csv"), row.names = F)
+ })
+
+ })
user system elapsed
107.98 2.10 123.36