为什么R在使用read.csv()时会占用这么多内存?

时间:2014-07-07 00:46:35

标签: r csv memory-management file-io

我正在Linux上运行R(kubuntu trusty)。我有一个近400MB的csv文件,主要包含数值:

$ ls -lah combined_df.csv 
-rw-rw-r-- 1 naught101 naught101 397M Jun 10 15:25 combined_df.csv

我启动R,df <- read.csv('combined_df.csv')(我得到一个1246536x25数据帧,3个int列,3个logi,1个因子和18个数字),然后使用here中的脚本来检查内存使用情况:

R> .ls.objects()
         Type  Size    Rows Columns
df data.frame 231.4 1246536      25

奇怪的是它报告较少的内存,但我想这只是因为CSV不是数字数据的有效存储方法。

但是当我检查系统内存使用情况时,top表示R正在使用20%的可用8GB内存。 ps报告类似:

$ ps aux|grep R
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
naught1+ 32364  5.6 20.4 1738664 1656184 pts/1 S+   09:47   2:42 /usr/lib/R/bin/exec/R

1.7Gb的RAM用于379MB数据集。这似乎过分了。我知道ps isn't necessarily an accurate way of measuring memory usage,但肯定不会超过5倍?!为什么R会占用这么多内存?

此外,R似乎在gc()的输出中报告了类似内容:

R> gc()
           used  (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells   497414  26.6    9091084 485.6  13354239 713.2
Vcells 36995093 282.3  103130536 786.9 128783476 982.6

2 个答案:

答案 0 :(得分:5)

正如我在上面的评论中所指出的,文档?read.csv中有一节标题为&#34; Memory Usage&#34;警告任何基于read.table的内容都可以使用&#34;令人惊讶的&#34;内存量并建议两件事:

  1. 使用colClasses参数和
  2. 指定每列的类型
  3. 指定nrows,即使是&#34;温和的高估&#34;。

答案 1 :(得分:1)

不确定您是否只想了解R的工作原理,或者您想要替代read.csv,但是从fread尝试data.table,它会更快,我认为它使用更少的记忆:

library(data.table)
dfr <- as.data.frame(fread("somecsvfile.csv"))