PostgreSQL сообщает об ошибке нехватки памяти с помощью EXEC SQL
Я использую EXEC SQL для выполнения очень длинного SQL (6000 символов) в файле PGC, иногда ошибкаSQLSTATE=[YE001] SQLERRM=[out of memory on line 400]
, иногда работает нормально. Используйте vmstat для просмотра памяти
-------------memory----------
swpd free buff cache
13324 2116768 3264 6004164
На машине осталось достаточно памяти Глядя на файл C, скомпилированный PGC, этот EXEC SQL переводится в
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "...long sql...",
ECPGt_varchar,&(h_vstrSHORI_DT),(long)8 + 1,(long)1,sizeof(struct varchar_1),ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT, ECPGt_EOLT);
if (sqlca.sqlcode < 0)
goto SQL_ERR;}
Запросите исходный код ECPGdo и вызовите его в ECPGdo.
char * ecpg_strdup(const char *string, int lineno) {
char *new;
if (string == NULL)
return NULL;
new = strdup(string);
if (!new) {
ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
return NULL;
}
return new;
}
После сбоя strdup здесь будет ошибка OOM. Я использую функцию strdup для проверки этого длинного SQL без ошибки OOM, поэтому здесь может быть и не ошибка.
Недостаток памяти вызван недостаточным объемом памяти машины или недостаточным объемом памяти postgresql?
Что мне делать, чтобы решить эту проблему?