關於讀取多個文件和內存管理有很多問題。我正在尋找能夠解決這兩個問題的信息。讀取多個文件時的內存管理
我經常需要將多個部分的數據作爲單獨的文件讀取,然後將它們組合成一個數據集,然後對其進行處理。我一直在使用類似下面的東西,直到現在 - rbinideddataset <- do.call("rbind", lapply(list.files(), read.csv, header = TRUE))
我很關心那個可以在每種方法中觀察到的凹凸。這可能是rbindeddataset和尚未結束的數據集一起存在於記憶中的實例,但我不知道足夠確定。有人能證實這一點嗎?
有什麼辦法可以將預先分配的原則擴展到這樣的任務嗎?或者任何人都知道的其他訣竅可能有助於避免碰撞? lapply
的結果我也試過rbindlist
,並沒有顯示凹凸。這是否意味着rbindlist
足夠聰明來處理這個問題?
data.table和Base R解決方案優於某些軟件包的產品。
EDIT 07-OCT-2013基於與@Dwin討論和@mrip
> 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顯示了最小的內存開銷,我不是很確定爲什麼。
+5。做得太好了。這正是我想要在我的問題中提出的建議,也是@迪文的回答,它應該是rbindlist,應該在這裏有所作爲,而不是fread。 – TheComeOnMan
很棒的迴應! @Codoremifa,順便說一句,你可以upvote以及給一個複選標記;) –
我懷疑你會發現'fread'和'rbindlist'是協同。它也被認爲是不好的做法,用與標準函數相同的標記來命名對象,所以'ls'應該是禁止的。 –