Луа не хватает памяти - PullRequest
2 голосов
/ 07 октября 2010

Я написал сложный скрипт lua, который использует библиотеку lua sockets.Он читает список файлов с диска, сортирует их по дате и отправляет их процессу HTTP.Количество файлов на диске составляет около 65 КБ. Использование памяти в диспетчере задач не превышает 200 МБ.

Через некоторое время сценарий возвращает:

lua: not enough memory

Я распечатываю текущий GCсчитать в пунктах, и он никогда не превышает 110 МБ

local freeMem = collectgarbage('count');
print("GC Count : " .. freeMem/1024 .. " MB");

Это на 32-битной машине Windows.

Какой лучший способ диагностировать это?

Ответы [ 2 ]

4 голосов
/ 07 октября 2010

Вся память проходит через одну функцию lua_Alloc.Это принимает форму:

typedef void* (*lua_Alloc) (void* ud, void* ptr, size_t oszie, size_t nsize);

Все распределения, перераспределения и освобождения проходят через это.Документация для этого может быть найдена в этой веб-странице .Вы можете легко написать свой собственный, чтобы отслеживать все операции с памятью.Например,

void* MyAlloc (void* ud, void* ptr, size_t osize, size_t nsize)
{
    (void)ud; (void)osize;   // Not used
    if (nsize == 0)
    {
        free(ptr)
        TrackSubtract(osize);
        return NULL;
    }
    else
    {
        void* p = realloc(ptr,nsize);
        TrackSubtract(osize);
        if (p) TrackAdd(nsize);
        return p;
    }
}

Вы можете написать функции TrackAdd () и TrackSubtract () для чего угодно: вывод в журнал;настроить счетчик и т. д.

Чтобы использовать новую функцию, вы передаете указатель на нее при создании состояния Lua:

lua_State* L = lua_newstate(&MyAlloc,0);

Документация для lua_newstate находится здесь .

Удачи.

1 голос
/ 07 октября 2010

Используйте perfmon для мониторинга вашего процесса и добавления счетчиков для личных и виртуальных байтов.

Когда ваш скрипт заканчивается «недостаточно памяти», посмотрите значение каждого счетчика. Если вы видите внезапные пики в использовании памяти, попробуйте добавить больше точек, в которых вы печатаете использование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...