2010-10-07 3 views
2

J'ai écrit un script lua compliqué qui utilise la bibliothèque lua sockets. Il lit une liste de fichiers à partir du disque, les trie par date et les envoie à un processus HTTP. Le nombre de fichiers sur le disque est d'environ 65 Ko. L'utilisation de la mémoire dans taskmanager ne dépasse pas 200 Mo.Lua manque de mémoire

Après un certain temps le script retourne:

lua: not enough memory 

j'imprimer le compte courant de GC aux points et il ne va jamais au-dessus de 110MB

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

C'est sur une machine Windows 32 bits.

Quelle est la meilleure façon de diagnostiquer cela?

Répondre

4

Toute la mémoire passe par la fonction unique lua_Alloc. Cela prend la forme de:

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

Toutes les affectations, réallocations et libérations passent par ceci. La documentation pour cela peut être trouvée au this web page. Vous pouvez facilement écrire les vôtres pour suivre toutes les opérations de la mémoire. Par exemple,

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; 
    } 
} 

Vous pouvez écrire les fonctions TrackAdd() et TrackSubtract() pour tout ce que vous voulez: la sortie à un journal; ajuster un compteur et ainsi de suite.

Pour utiliser votre nouvelle fonction vous passez un pointeur vers lorsque vous créez l'état Lua:

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

La documentation à lua_newstate se trouve here.

Bonne chance.

1

Utilisez perfmon pour surveiller votre processus et ajouter des compteurs pour les octets privés et les octets virtuels. Lorsque votre script se termine par «Mémoire insuffisante», reportez-vous à la valeur de chaque compteur. Si vous constatez des pics soudains dans l'utilisation de votre mémoire, essayez d'ajouter plus de points dans lesquels vous imprimez l'utilisation de la mémoire.

Questions connexes