单向量函数R的内存耗尽

时间:2018-07-13 07:53:50

标签: r

我想在长度为40k的向量上运行单个函数(即使用DescTools库的calculating the Gini coefficient)。

set.seed(42)
my_vec = sample(1:100000, 40000, replace = T)

#the function to get the Gini with confidence interval
DescTools::Gini(my_vec, conf.level = 0.99)

计算置信区间(仅计算Gini系数而没有置信区间可立即完美运行)会导致我的计算机出现一些内存问题(64位R版本,8 GB RAM)并返回

Error: vector memory exhausted (limit reached?)

为解决这个问题,我研究了以下选项:

  • 增加R可用的内存,但在Mac上找不到该选项(memory.limit()似乎仅适用于Windows)
  • 使用parallel R库并行运行函数

我正在为后者苦苦挣扎,因为该函数不需要对多列进行任何迭代。因此,我不希望并行化能够工作:

mclapply(my_vec, function(x) Gini(x, unbiased = T, conf.level = 0.99), mc.cores = 3) #does not work

有没有一种方法可以避免内存问题,如果并行化是一种解决方案,那么如何为一个向量实现它呢?非常感谢!

1 个答案:

答案 0 :(得分:2)

您有一个Lorenz curve and the Gini index in RevoScaleR的实现,无论向量大小如何,都可以按块获取计算结果。

set.seed(42)
my_vec = data.frame(V1 = sample(1:100000, 40000, replace = T))

# Compute Lorenz
lorenzOut <- rxLorenz(orderVarName = "V1", data = my_vec)

# Compute the Gini Coefficient
giniCoef <- rxGini(lorenzOut)
giniCoef
0.335597

CI:

boot <- replicate(1000, rxGini(rxLorenz(orderVarName = "V1", 
                                data = my_vec[sample.int(nrow(my_vec), nrow(my_vec), replace = TRUE), , drop = FALSE], reportProgress = 0)))

summary(boot)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.3315  0.3347  0.3356  0.3356  0.3364  0.3396 

quantile(boot, probs = c(0.005, 0.995))
     0.5%     99.5% 
0.3324822 0.3389219