我正在使用 R 进行一些数据分析。系统规格:i5 + 4GB RAM。出于某种原因,我的 R 会话占用了比我的数据大得多的 RAM,这使我几乎没有空间进行其他操作。
我读了一个550MB 的 csv文件,R 占用的内存:1.3 - 1.5GB 我将 csv 保存为 .RData 文件。文件大小:183MB。在 R 中加载文件,R 占用的内存: 780MB。知道为什么会发生这种情况以及如何解决吗?
编辑:该文件有 123 列和 1190387 行。变量的类型为num
和int
。
我正在使用 R 进行一些数据分析。系统规格:i5 + 4GB RAM。出于某种原因,我的 R 会话占用了比我的数据大得多的 RAM,这使我几乎没有空间进行其他操作。
我读了一个550MB 的 csv文件,R 占用的内存:1.3 - 1.5GB 我将 csv 保存为 .RData 文件。文件大小:183MB。在 R 中加载文件,R 占用的内存: 780MB。知道为什么会发生这种情况以及如何解决吗?
编辑:该文件有 123 列和 1190387 行。变量的类型为num
和int
。
一个数值(双精度浮点)存储在 8 个字节的 ram 中。
一个整数值(在这种情况下)使用 4 个字节。
您的数据有 1,190,387 * 123 = 146,417,601 个值。
如果所有列都是数字,则使用 1,171,340,808 字节的 ram (~1.09GB)。
如果都是整数,则需要 585,670,404 字节(~558MB)。
因此,您的数据使用 780MB 内存是完全合理的。
非常一般的建议:
R 使用更多内存可能是因为一些对象的复制。尽管这些临时副本被删除,但 R 仍然占用空间。要将此内存返回给操作系统,您可以调用该gc
函数。但是,当需要内存时,gc
会自动调用。
此外,在 R 中,550 mb 的 csv 文件映射到 550 mb 并不明显。这取决于列的数据类型(float、int、character),它们都使用不同的内存量。
Rdata 文件较小这一事实并不奇怪,因为 R 会压缩数据,请参阅save
.
我假设您使用的是基于read.table()的read.csv( ) 。
这些函数的问题在于它们严重地分割了内存。并且由于 R 垃圾收集器无法移动分配的空间以从碎片部分释放内存(R 垃圾收集器的一个缺点),因此您只能选择您选择的解决方案:
(与之前的评论重叠一些)
您可以使用 readr 包中的 read_csv 或 read_table,这有助于更快地加载数据。
使用 gc() 和 mem_change() 检查内存的变化,并确定哪一步导致了内存的增加。
您当然可以构建连接并按块读取数据。
或者创建一个数据库然后使用RPostgreSQL;RSQLite;RMySQL。检查 dbConnect、dbWriteTable、dbGetQuery。
没有生殖的例子很难说更多。