Я работаю над операциями, интенсивно использующими память, в R. Я видел на этом сайте несколько советов об увеличении лимита памяти с помощью R_MAX_VSIZE, но я не нашел четкого объяснения того, какие именно значения можно вводить и как они читаются.
Какие форматы принимаются/действительны для переменной среды R_MAX_VSIZE?
Вот что я нашел на данный момент:
Базовая документация R - Память: память, доступная для хранения данных
Максимальный размер векторной кучи можно установить с помощью переменной окружения
R_MAX_VSIZE
Я не могу найти дополнительную информацию о том, какие значения разрешены на этой странице справки.
Ответ Грэма Фроста на R на MacOS Ошибка: векторная память исчерпана (достигнут предел?)
В этом ответе предлагается установить значение «100 ГБ». Когда я столкнулся с проблемой на своем компьютере, это фактически решило мою проблему, но есть и другие ответы, указывающие на допустимость других значений.
Ответ Коннора Диббла на Ошибка: векторная память исчерпана (достигнут предел?) R 3.5.0 macOS
В этом ответе значение задается с помощью export R_MAX_VSIZE=32000000000, которое не включает единицы измерения, поэтому я предполагаю, что оно интерпретируется как байты.





По крайней мере, начиная с 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);
}
}