我有一個數據幀,該數據幀是使用RMySQL查詢到SQL服務器並在之後對其應用dplyr。R數據幀的內存使用情況
當我在其上使用subset()
後,得到的子集數據幀將佔用與原始數據幀相同的空間。
該子集具有〜10%的原始數據幀的行數。我將數據框保存到一個CSV文件並重新加載,然後它的大小已達到我預期的10%。
# include dplyr and RMySQL, setup connection... etc.
df = query("SELECT created_at FROM requests")
requests$created_at %>%
as.POSIXlt %>%
cut.POSIXt(breaks="sec") %>%
table %>% as.data.frame -> df
colnames(df) <- c('created_at', 'requests')
dfss <- subset(df, requests > 3)
現在,內存使用情況顯示爲:
Type Size Rows Columns
df data.frame 455869312 5180320 2
dfss data.frame 414427000 13 2
而像DFSS $做任何事情之後請求< - 1,我仍然得到:
Type Size Rows Columns
df data.frame 455869312 5180320 2
dfss data.frame 414427000 13 2
如果我截斷表通過使用head(df,10000)然後再做整個事情,我會得到類似的行爲,即使只有幾行,子集只比原始集合稍小一點:
Type Size Rows Columns
df data.frame 20199008 229521 2
dfss data.frame 18440576 9718 2
這是怎麼回事?
一些好的想法在這裏:http://stackoverflow.com/questions/1358003/tricks-to-manage-the-available-memory-in-an-r-session – Stedy
實際上,最終的子集佔用(幾乎)零內存。第二個對象不是副本。只有在修改第一個對象時纔會進行復制。 – Andrie
是的,看下面的答案 –