Какие значения можно ввести для R_MAX_VSIZE в R?

Я работаю над операциями, интенсивно использующими память, в R. Я видел на этом сайте несколько советов об увеличении лимита памяти с помощью R_MAX_VSIZE, но я не нашел четкого объяснения того, какие именно значения можно вводить и как они читаются.

Какие форматы принимаются/действительны для переменной среды R_MAX_VSIZE?

Вот что я нашел на данный момент:

  1. Базовая документация R - Память: память, доступная для хранения данных

    Максимальный размер векторной кучи можно установить с помощью переменной окружения R_MAX_VSIZE

    Я не могу найти дополнительную информацию о том, какие значения разрешены на этой странице справки.

  2. Ответ Грэма Фроста на R на MacOS Ошибка: векторная память исчерпана (достигнут предел?)

    В этом ответе предлагается установить значение «100 ГБ». Когда я столкнулся с проблемой на своем компьютере, это фактически решило мою проблему, но есть и другие ответы, указывающие на допустимость других значений.

  3. Ответ Коннора Диббла на Ошибка: векторная память исчерпана (достигнут предел?) R 3.5.0 macOS

    В этом ответе значение задается с помощью export R_MAX_VSIZE=32000000000, которое не включает единицы измерения, поэтому я предполагаю, что оно интерпретируется как байты.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По крайней мере, начиная с R-devel на момент написания этой статьи (4.5.0), глава Память, в которой рассматривается R_MAX_VSIZE, была обновлена, чтобы указать, каким должно быть ее значение:

Пределы векторной кучи указаны в байтах.

Однако в исходном коде R (по крайней мере, его зеркале) мы видим, что значение, полученное из переменной окружения, передается в R_Decode2Long:

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

В определении этой функции также интерпретируются значения с единицами измерения (например, 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);
    }
}

Другие вопросы по теме