我正在尝试使用data.table
包在R 64位上加载大型CSV文件(226M行乘38列)。磁盘上文件的大小约为27Gb。我在具有64GB RAM的服务器上执行此操作。我关闭了其他所有内容并启动了一个全新的R / Rstudio会话,所以当我启动fread
时,只使用了2Gb的内存。作为读取过程,我看到内存使用率攀升到大约45.6 Gb,然后我得到了可怕的Error: cannot allocate vector of size 1.7 Gb
。但是,仍有超过18Gb可用。是否有可能在18Gb的RAM中没有一个连续的1.7Gb块?它是否与committed size(我承认不完全理解)有关,如果是这样,有没有办法最小化承诺的大小,以便留下足够的空间
该列表包含我想要汇总的一组用户的历史记录,并总结某些统计信息。我已经能够在select
中使用fread
导入38列的子集,所以我不会完全丢失,但它确实意味着我需要使用其他变量,我需要挑选,最终可能会遇到同样的错误。
对于我的设置,有没有其他方法可以将整个数据集放入内存,或者我是否需要继续只导入子集或移动到大数据友好平台?
谢谢。
R version 3.3.0 Patched (2016-05-11 r70599)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server >= 2012 x64 (build 9200)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.6
loaded via a namespace (and not attached):
[1] tools_3.3.0 chron_2.3-47
答案 0 :(得分:2)
你的内存不足是因为某些类型的数据可以使用较少的内存作为纯文本而不是内存(相反的情况也是如此)。典型的例子是例如单个数字整数(0-9),它只占用文本文件中的一个字节,但在R中将使用4个字节的存储器(相反,大于4位数字将占用比相应文本字符更少的内存)。
对此的一种解决方法是将这些列读作character
,这将使内存占用保持不变,并且只在对它们执行数值运算时将它们转换为整数。权衡取舍自然会很快。