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
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a