6

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

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

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

4

4 回答 4

18

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

因此,您的数据使用 780MB 内存是完全合理的。

非常一般的建议:

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

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

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

Rdata 文件较小这一事实并不奇怪,因为 R 会压缩数据,请参阅save.

于 2012-07-30T04:52:47.380 回答
1

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

这些函数的问题在于它们严重地分割了内存。并且由于 R 垃圾收集器无法移动分配的空间以从碎片部分释放内存(R 垃圾收集器的一个缺点),因此您只能选择您选择的解决方案:

  • 通过 read.table 读取数据。
  • 通过save()保存它。
  • 杀死R。
  • 通过load()加载数据。
于 2016-08-17T12:05:42.703 回答
0

(与之前的评论重叠一些)

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

使用 gc() 和 mem_change() 检查内存的变化,并确定哪一步导致了内存的增加。

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

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

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

于 2015-10-05T05:07:32.173 回答