代码之家  ›  专栏  ›  技术社区  ›  Joshua Shew

可以为R中的“R_MAX_VSIZE”输入哪些值?

  •  2
  • Joshua Shew  · 技术社区  · 1 年前

    我正在R中进行内存密集型操作。我在这个网站上看到了一些关于使用 R_MAX_VSIZE 但我还没有找到一个明确的解释,确切地说,什么样的值可以输入,以及如何读取。

    哪些格式可接受/有效 R_MAX_VSIZE 环境变量?

    以下是我迄今为止的发现:

    1. R base documentation - Memory: Memory Available for Data Storage

      可以使用环境变量设置最大矢量堆大小 R_MAX_VSIZE

      我找不到此帮助页上允许哪些值的其他信息。

    2. Graeme Frost's answer R on MacOS Error: vector memory exhausted (limit reached?)

      此答案建议将该值设置为“100Gb”。当我在机器上遇到这个问题时,这实际上解决了我的问题,但还有其他答案表明其他值是有效的。

    3. Connor Dibble's answer Error: vector memory exhausted (limit reached?) R 3.5.0 macOS

      此答案使用设置值 export R_MAX_VSIZE=32000000000 它不包括单位,所以我认为它被解释为字节。

    1 回复  |  直到 1 年前
        1
  •  3
  •   Justin Singh-M.    1 年前

    至少在编写本文(4.5.0)时的R-devel之后 Memory 涵盖的章节 R_MAX_VSIZE 已更新以包括其值 应该

    矢量堆限制以字节为单位。

    然而,在R的源代码中(至少 mirror 的),我们可以看到从环境变量中检索到的值被传递到 R_Decode2Long :

    if ((p = getenv("R_MAX_VSIZE"))) {
    value = R_Decode2Long(p, &ierr);
    

    在这个函数的 definition ,单位为(即100G、20M等)的值也被解释为:

    R_size_t R_Decode2Long(char *p, int *ierr)
    {
        R_size_t v = strtol(p, &p, 10);
        *ierr = 0;
        if(p[0] == '\0') return v;
        /* else look for letter-code ending : */
        if(R_Verbose)
        REprintf("R_Decode2Long(): v=%ld\n", (long)v);
        // NOTE: currently, positive *ierr are not differentiated in the callers:
        if(p[0] == 'G') {
        if((Giga * (double)v) > (double) R_SIZE_T_MAX) { *ierr = 4; return(v); }
        return (R_size_t) Giga * v;
        }
        else if(p[0] == 'M') {
        if((Mega * (double)v) > (double) R_SIZE_T_MAX) { *ierr = 1; return(v); }
        return (R_size_t) Mega * v;
        }
        else if(p[0] == 'K') {
        if((1024 * (double)v) > (double) R_SIZE_T_MAX) { *ierr = 2; return(v); }
        return (1024*v);
        }
        else if(p[0] == 'k') {
        if((1000 * (double)v) > (double) R_SIZE_T_MAX) { *ierr = 3; return(v); }
        return (1000*v);
        }
        else {
        *ierr = -1;
        return(v);
        }
    }