[Python-es] Asignación de memoria dinámica (malloc/free) en Python

Oswaldo Hernández listas en soft-com.es
Jue Sep 30 10:31:50 CEST 2010


El 29/09/2010 12:52, Santi Saez escribió:

>
> FYI, el método de obtener la memoria libre disponible vía 'free' para
> este escenario no sirve: se está utilizando un sistema de virtualizacion
> basado en OpenVZ donde los contenedores (algo así como entornos chroot
> avanzados) ven toda la RAM + swap instalada en el sistema, pero solo
> pueden hacer uso de parte de ella, así que no queda otra que tirar de
> malloc() para ver hasta donde puedo reservar :)
>

No conozco los sitemas de virtualización, pero si tiras de malloc ten en 
cuenta que el resultado que obtendrás es tamaño máximo para un bloque 
"continuo" de memoria, no toda la memoria disponible.

En cuanto al problema de ctypes en sistemas de 64 bits, da la impresión 
de que el puntero de 64 bits que devuelve malloc esta siendo 
transformado por la libreria ctypes, o el propio python, a alguna otra 
cosa que no entiende bien free().

Como simple alternativa puedes escribir un programita C que haga el 
calculo y devuelva el resultado, lo ejecutas desde python con 
subprocess.popen y listo.
Por ejemplo:

<C code>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     char        *m;
     int         megas;

     for (megas=1; megas<100000; megas++) {
         m = malloc(megas * 1024 * 1024);
         if (m) {
             free(m);
             printf("test para %d MB OK\n", megas);
         }
         else {
             printf("fallo con %d MB\n", megas);
             return (megas--);
         }
     }
     return megas;
}
</C code>

Saludos,
-- 
Oswaldo Hernández


Más información sobre la lista de distribución Python-es