关于读取多个文件和内存管理有很多问题。我正在寻找可以同时解决这两个问题的信息。
我经常需要将数据的多个部分作为单独的文件读取,将它们重新绑定到一个数据集中,然后对其进行处理。到目前为止,我一直在使用类似下面的东西 -
rbinideddataset <- do.call("rbind", lapply(list.files(), read.csv, header = TRUE))
我担心在每种方法中都可以观察到的颠簸。这可能是 rbindeddataset 和 not-yet-rbindeddatasets 同时存在于内存中的实例,但我不知道如何确定。有人可以证实这一点吗?
有什么方法可以将预分配原则扩展到这样的任务?或者其他任何人都知道的技巧可能有助于避免这种颠簸?我还尝试rbindlist
了结果lapply
,但没有显示凹凸。这是否意味着rbindlist
足够聪明来处理这个问题?
data.table 和 Base R 解决方案优于某些软件包的产品。
根据与@Dwin 和@mrip 的讨论,于 2013 年 10 月 7 日编辑
> library(data.table)
> filenames <- list.files()
>
> #APPROACH 1 #################################
> starttime <- proc.time()
> test <- do.call("rbind", lapply(filenames, read.csv, header = TRUE))
> proc.time() - starttime
user system elapsed
44.60 1.11 45.98
>
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 350556 18.8 741108 39.6 715234 38.2
Vcells 1943837 14.9 153442940 1170.7 192055310 1465.3
>
> #APPROACH 2 #################################
> starttime <- proc.time()
> test <- lapply(filenames, read.csv, header = TRUE)
> test2 <- do.call("rbind", test)
> proc.time() - starttime
user system elapsed
47.09 1.26 50.70
>
> rm(test)
> rm(test2)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 350559 18.8 741108 39.6 715234 38.2
Vcells 1943849 14.9 157022756 1198.0 192055310 1465.3
>
>
> #APPROACH 3 #################################
> starttime <- proc.time()
> test <- lapply(filenames, read.csv, header = TRUE)
> test <- do.call("rbind", test)
> proc.time() - starttime
user system elapsed
48.61 1.93 51.16
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 350562 18.8 741108 39.6 715234 38.2
Vcells 1943861 14.9 152965559 1167.1 192055310 1465.3
>
>
> #APPROACH 4 #################################
> starttime <- proc.time()
> test <- do.call("rbind", lapply(filenames, fread))
> proc.time() - starttime
user system elapsed
12.87 0.09 12.95
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 351067 18.8 741108 39.6 715234 38.2
Vcells 1964791 15.0 122372447 933.7 192055310 1465.3
>
>
> #APPROACH 5 #################################
> starttime <- proc.time()
> test <- do.call("rbind", lapply(filenames, read.csv, header = TRUE))
> proc.time() - starttime
user system elapsed
51.12 1.62 54.16
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 350568 18.8 741108 39.6 715234 38.2
Vcells 1943885 14.9 160270439 1222.8 192055310 1465.3
>
>
> #APPROACH 6 #################################
> starttime <- proc.time()
> test <- rbindlist(lapply(filenames, fread ))
> proc.time() - starttime
user system elapsed
13.62 0.06 14.60
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 351078 18.8 741108 39.6 715234 38.2
Vcells 1956397 15.0 128216351 978.3 192055310 1465.3
>
>
> #APPROACH 7 #################################
> starttime <- proc.time()
> test <- rbindlist(lapply(filenames, read.csv, header = TRUE))
> proc.time() - starttime
user system elapsed
48.44 0.83 51.70
> rm(test)
> rm(starttime)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 350620 18.8 741108 39.6 715234 38.2
Vcells 1944204 14.9 102573080 782.6 192055310 1465.3
正如预期的那样,fread 节省的时间最多。但是,方法 4,6 和 7 显示最小的内存开销,我不确定为什么。