[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