2014-09-04 50 views
4

我已经从UCI机器学习数据集库中下载了一个大文件。 (〜300MB)。预测R中的内存使用情况

有没有一种方法可以预测加载数据集所需的内存,然后将其加载到R内存中?

Google搜索了很多,但到处都是我能找到的是如何计算与R-探查和其他几个包的内存,但对象加载到R.

+2

取决于它是如何存储的(以及它是什么)。基本上可以使用C等价值计算,然后添加一些R开销。 – PascalVKooten 2014-09-04 20:15:36

+1

作为一个经验法则,我已经注意到,如果我gzip一个csv文件,gzip文件大约与它的.RData相同。 – mgriebe 2014-09-04 20:15:54

+1

并明白300MB是一个适度的文件,而不是“巨大的”。 – 2014-09-05 01:34:24

回答

5

基于“R编程” coursera当然,U之后可以使用数据中的行数和列数来计算最近的内存使用量“U可以从代码箱/元文件中获得该信息”

需要的内存=否。列*号。行* 8个字节/数字的

所以举例来说,如果你有1,500,00行和列120中,您将需要超过134 GB的内存热备需要

ü也可以适用于其他类型的同样的方法数据关注用于存储不同数据类型的字节数。

+0

我会使用10而不是8作为字节/数字系数,并且我会将它增加三倍来确定需要多少空间。如果材料只是字符数据,则比率只会在1.1左右,如果您将它读入因子数据可能甚至低于1。 – 2014-09-04 22:10:08

4

如果您的数据存储在csv文件中,您可以先读取该文件的子集并使用object.size函数计算内存使用量(以字节为单位)。然后,你可以计算与wc命令行实用程序文件中的行的总数,并使用行数来扩展你的子集的内存使用情况,以获得总使用量的估计:

top.size <- object.size(read.csv("simulations.csv", nrow=1000)) 
lines <- as.numeric(gsub("[^0-9]", "", system("wc -l simulations.csv", intern=T))) 
size.estimate <- lines/1000 * top.size 

想必有一些对象开销,所以我预计size.estimate是加载整个csv文件时高估内存使用总量;如果您使用更多线路来计算top.size,此效果将会减弱。当然,如果文件的前1000行不能代表整个文件内容,这种方法可能不准确。

0

R有函数object.size(),它提供了用于存储R对象的内存估计。 您可以这样使用:

predict_data_size <- function(numeric_size, number_type = "numeric") { 
    if(number_type == "integer") { 
    byte_per_number = 4 
    } else if(number_type == "numeric") { 
    byte_per_number = 8 #[ 8 bytes por numero] 
    } else { 
    stop(sprintf("Unknown number_type: %s", number_type)) 
    } 
    estimate_size_in_bytes = (numeric_size * byte_per_number) 
    class(estimate_size_in_bytes) = "object_size" 
    print(estimate_size_in_bytes, units = "auto") 
} 
# Example 
# Matrix (rows=2000000, cols=100) 
predict_data_size(2000000*100, "numeric") # 1.5 Gb