Página 1 de 2

Python e a Memória (RAM)

MensagemEnviado: Domingo Jul 03, 2011 8:11 pm
por filipematos
Boa tarde quarkianos :),
Eu estou aqui com um problema relacionado com o uso da memória do computador. Eu criei um programa com um algoritmo que descobre um numero com n divisores seguidos.. O meu problema é o seguinte:
O programa tem por base ciclos, e durante cada ciclo ele imprime um numero, acontece que o programa ao ir correndo vai ocupando a memória chegando a um ponto em que toda a memória é consumida e o programa fecha com um erro :s.
Precisava de ajuda

Re: Python e a Memória (RAM)

MensagemEnviado: Domingo Jul 03, 2011 8:27 pm
por Bruno Oliveira
Mete aqui o código... :roll:

Re: Python e a Memória (RAM)

MensagemEnviado: Domingo Jul 03, 2011 8:29 pm
por filipematos
Aqui está ele
Código: Seleccionar Todos
def tabuada(a):
    divisores = range(1,a+1)
    m=0
    x = 6466510
    while m != a:
        print x
        m = 0
        fob = open("F:\Filipe\Documentos\Física\Phyton\divisas.txt","w")
        fob.write("%i" % x)
        fob.close()
        for h in divisores:
            if x % h == 0:
                m = m+1
           
        x = x+1
    print "O numero é %i" %x
    print m

a= input()
tabuada(a)

Re: Python e a Memória (RAM)

MensagemEnviado: Domingo Jul 03, 2011 8:55 pm
por Bruno Oliveira
Creio que tens ali uma variável m inicializada a mais dentro do while, e entretanto, estás a criar demasiadas variáveis auxiliares e estás a ocupar bastante memória, é mais simples se meteres os divisores de um numero numa lista (via programação funcional ou outra) e depois usas um if para mostrar a lista apenas se ela tiver comprimento n... Por exemplo...

Re: Python e a Memória (RAM)

MensagemEnviado: Domingo Jul 03, 2011 9:09 pm
por filipematos
Esse m dentro é necessário porque o m tem que ser zero em cada ciclo ... Os divisores estão numa lista, mas eu não percebi bem isso...

Re: Python e a Memória (RAM)

MensagemEnviado: Terça Jul 05, 2011 4:28 pm
por filipematos
A minha suspeita é que o comando print x vai armazenando os "xs" em memória ram e chega a uma altura que puff... O problema é que se tirar o print x ele não me escreve o x no documento e isso ainda é pior :S

Re: Python e a Memória (RAM)

MensagemEnviado: Terça Jul 05, 2011 6:41 pm
por jap
Hum,

Filipe, posta aqui o teu teste (que valor de a usaste como input?) e a mensagem de erro que obtiveste.

Existem alguns problemas no teu código...:wink:

PS: Também não percebi bem o que pretendes fazer com o programa. Explica melhor, por favor.

Re: Python e a Memória (RAM)

MensagemEnviado: Sábado Jul 09, 2011 7:51 pm
por filipematos
Desde já muito obrigado,
Acho que já consegui resolver o problema...
Inseri um try lá no meio para quando ele dar o erro imprimir o x e continuar e assim já não pára nem vai ocupando a memória. Contudo ele continua muito lento...

O que pretendo fazer exactamente é chegar a um número que tenha n divisores consecutivos de 1 até n neste caso 20. Ou seja, o meu objectivo é encontrar um numero que tenha como primeiros vinte divisores os numeros de 1 a20 (1,2,3,4,5,6,7,8,9,10,11,...,20) Mas ele demora tanto tempo a correr que não sei se lá chegarei vivo :).
O código que utilizei foi o seguinte:
Código: Seleccionar Todos
def tabuada(a):
    divisores = range(1,a+1)
    m=0
    x = 29551635
    while m != a:
        m = 0
        try:
            fob = open("F:\Filipe\Documentos\Física\Phyton\divisas.txt","w")
            fob.write("%i" % x)
            fob.close()
        except:
            print x
        for h in divisores:
            if x % h == 0:
                m = m+1
           
        x = x+1
    print "O numero é %i" %x
    print m

a= input()
tabuada(a)


A variavel a indica o numero de divisores que quero, quando corro o programa ponho 20 visto ser esse o meu objectivo.
A variável x indica o número em que ele começa a testar... Como eu já desliguei o computador muitas vezes, desligou-se sozinho, ou ocupava a memória toda, eu sempre que o corro altero o x para o número que está no documento divisas.txt

Re: Python e a Memória (RAM)

MensagemEnviado: Sábado Jul 09, 2011 8:33 pm
por rigillescherrer
não sei se vai ajudar, mas achar o menor número que é divisível por [d_1, d_2, d_3, \cdots, d_n] é equivalente ao mmc(d_1, d_2, d_3, \cdots, d_n)

Re: Python e a Memória (RAM)

MensagemEnviado: Terça Jul 12, 2011 9:50 pm
por Bruno Oliveira
Sim Rígille, o conceito matemático a usar era o de MMC de uma sequência de números, mas neste caso simples, e para quem está a aprender, tomar conhecimento do operador % também tem a sua utilidade. :wink:

Python e a velocidade de processamento

MensagemEnviado: Quarta Jul 20, 2011 3:41 pm
por filipematos
Acho que não vale a pena criar outro tópico para isto. O meu problema agora não é a memória mas sim o CPU. Qualquer problema do Projecto Euler que tento resolver com recurso ao python, fica horas e horas a correr dias até e algumas vezes até desisto... Eu tento mudar os algoritmos mas a velocidade com que ele corre cada ciclo é muito pequena quando os números são grandes. Alguém me pode dar uma ajuda? E ainda por cima ele só consegue utilizar um núcleo do meu processador( 4 núcleos) mas este está sempre a 100 %...

Re: Python e a Memória (RAM)

MensagemEnviado: Quarta Jul 20, 2011 4:35 pm
por Tharis
No PE, se utilizares um algoritmo eficiente, consegues corrê-lo em qualquer linguagem, no máximo em questão de minutos. E já agora, os ciclos não demoram mais com números grandes. Com números grandes, tens mais ciclos e portanto demora mais. Mete aqui o problema que estás a resolver e o algoritmo (com código) que alguém há-de te ajudar. ;)

Re: Python e a Memória (RAM)

MensagemEnviado: Quarta Jul 20, 2011 7:37 pm
por Bruno Oliveira
Se o problema ainda for o dos divisores, um simples brute force chega perfeitamente. Estando resolvido por brute force, pode ser interessante implementar o algoritmo descrito pelo user que se disponibilizou a escrever a solução... :)

Re: Python e a Memória (RAM)

MensagemEnviado: Quarta Jul 20, 2011 7:44 pm
por filipematos
Esse foi um dos que desisti :) O que é o brute force(se é que é algo)?

Re: Python e a Memória (RAM)

MensagemEnviado: Quarta Jul 20, 2011 11:45 pm
por Bruno Oliveira
Brute force, consiste como o nome diz, em resolver algo pela força bruta, ou seja, traduzindo directamente o enunciado do problema para código, sem pensar em optimizações.

É claro que este método, é excelente, pois nunca falha e encontrará sempre a resposta. Pode é demorar milhões de anos a fazê-lo. O exemplo mais gritante que encontro disto é o do caixeiro viajante.

Regra geral, no PE, ou em problemas de programação em geral, é sempre exigida alguma Matemática, ou até ingenuidade ganha com a experiência ou vendo soluções de gente mais experiente, para se poder escrever código eficiente. Isto é algo que em teoria é simples, mas que está em constante treino e leva muito tempo a aprender ou nunca será totalmente aprendido, pois existem imensos problemas e imensas soluções diferentes.

A diferença entre um bom programador e um craque, está em partir de associações de problemas para os quais consegue desenvolver um bom algoritmo e generalizar dentro do possível esses algoritmos conhecidos para resolver novos desafios. :wink: