在R中加载/读取数据会占用太多内存

时间:2012-07-30 04:29:26

标签: r

我正在使用R进行一些数据分析。系统规格:i5 + 4GB RAM。 出于某种原因,我的R会话占用了比我的数据大得多的RAM,这让我只有很少的空间用于其他操作。

我读了 550MB csv 文件,内存占用 R:1.3 - 1.5GB 我将csv保存为.RData文件。 文件大小:183MB 。加载R中的文件, R:780MB 占用的内存。 知道为什么会发生这种情况以及如何解决它?

编辑: 该文件有123列和1190387行。变量属于numint类型。

4 个答案:

答案 0 :(得分:16)

数值(双精度浮点)存储在8个字节的ram中 整数值(在本例中)使用4个字节 您的数据有1,190,387 * 123 = 146,417,601个值 如果所有列都是数字,则使用1,171,340,808字节的ram(~1.09GB) 如果all都是整数,则需要585,670,404个字节(~558MB)。

因此,您的数据使用780MB内存非常有意义。

非常一般的建议:

  1. 将data.frame转换为矩阵。矩阵运算通常具有较少的开销。
  2. 试试R包bigmemory:http://cran.r-project.org/web/packages/bigmemory/index.html
  3. 购买更多公羊。可能你的机器最多可以支持16GB。
  4. 不要同时将所有数据加载到ram中。加载行或列的子集,分析,保存结果,重复。
  5. 使用非常小的测试数据集来设计分析,然后分析具有更多内存的另一台机器/服务器上的完整数据集。

答案 1 :(得分:5)

R使用更多内存可能是因为某些对象的复制。虽然这些临时副本被删除,但R仍占用空间。要将此内存返回给操作系统,您可以调用gc功能。但是,当需要内存时,会自动调用gc

此外,550 mb csv文件在R中映射到550 mb并不明显。这取决于列的数据类型(float,int,character),它们都使用不同的内存量。

由于R压缩数据,因此Rdata文件较小的事实并不奇怪,请参阅save的文档。

答案 2 :(得分:1)

我假设您使用的是基于 read.table() read.csv()

这些功能的问题在于它们会严重破坏内存。并且由于R垃圾收集器无法移动分配的空间来从碎片部分释放内存(R垃圾收集器的一个简称),您将无法使用您选择的解决方案:

  • 通过read.table读取数据。
  • 通过保存()保存。
  • 杀死R.
  • 通过 load()加载数据。

答案 3 :(得分:0)

(与之前的评论重叠)

您可以使用readr包中的read_csv或read_table,这有助于更快地加载数据。

使用gc()和mem_change()检查内存中的更改,并确定哪个步骤会导致内存增加。

您当然可以通过块构建连接并读取数据。

或创建数据库然后使用RPostgreSQL; RSQLite; RMySQL。检查dbConnect,dbWriteTable,dbGetQuery。

没有繁殖的例子,很难说更多。