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

nau*_*101 2 csv file-io memory-management r

我正在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
Run Code Online (Sandbox Code Playgroud)

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

R> .ls.objects()
         Type  Size    Rows Columns
df data.frame 231.4 1246536      25
Run Code Online (Sandbox Code Playgroud)

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

但是当我检查系统内存使用情况时,top说R使用了我可用的8GB内存的20%.并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
Run Code Online (Sandbox Code Playgroud)

用于379MB数据集的1.7Gb RAM.这似乎过分了.我知道这ps不一定是衡量内存使用情况的准确方法,但肯定不会超过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
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 5

正如我在上面的评论中所指出的,文档中有一个?read.csv标题为"内存使用"的部分警告基于的任何内容都read.table可能使用"令人惊讶"的内存量并建议两件事:

  1. 使用colClasses参数指定每列的类型,和
  2. 指出nrows,即使是"温和的过高估计".