我正在使用R进行一些数据分析。系统规格:i5 + 4GB RAM。 出于某种原因,我的R会话占用了比我的数据大得多的RAM,这让我只有很少的空间用于其他操作。
我读了 550MB csv 文件,内存占用 R:1.3 - 1.5GB 我将csv保存为.RData文件。 文件大小:183MB 。加载R中的文件, R:780MB 占用的内存。 知道为什么会发生这种情况以及如何解决它?
编辑:
该文件有123列和1190387行。变量属于num
和int
类型。
答案 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 :(得分: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垃圾收集器的一个简称),您将无法使用您选择的解决方案:
答案 3 :(得分:0)
(与之前的评论重叠)
您可以使用readr包中的read_csv或read_table,这有助于更快地加载数据。
使用gc()和mem_change()检查内存中的更改,并确定哪个步骤会导致内存增加。
您当然可以通过块构建连接并读取数据。
或创建数据库然后使用RPostgreSQL; RSQLite; RMySQL。检查dbConnect,dbWriteTable,dbGetQuery。
没有繁殖的例子,很难说更多。