Python e a Memória (RAM)

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Python e a Memória (RAM)

Mensagempor filipematos em Domingo Jul 03, 2011 8:11 pm

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
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor Bruno Oliveira em Domingo Jul 03, 2011 8:27 pm

Mete aqui o código... :roll:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor filipematos em Domingo Jul 03, 2011 8:29 pm

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)
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor Bruno Oliveira em Domingo Jul 03, 2011 8:55 pm

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...
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor filipematos em Domingo Jul 03, 2011 9:09 pm

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...
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor filipematos em Terça Jul 05, 2011 4:28 pm

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
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor jap em Terça Jul 05, 2011 6:41 pm

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.
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Python e a Memória (RAM)

Mensagempor filipematos em Sábado Jul 09, 2011 7:51 pm

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
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor rigillescherrer em Sábado Jul 09, 2011 8:33 pm

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)
Imagem \huge = \int
Avatar do utilizador
rigillescherrer
bottom-Quark!
bottom-Quark!
 
Mensagens: 77
Registado: Domingo Set 05, 2010 8:56 am
Localização: Vitória, Brasil

Re: Python e a Memória (RAM)

Mensagempor Bruno Oliveira em Terça Jul 12, 2011 9:50 pm

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:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Python e a velocidade de processamento

Mensagempor filipematos em Quarta Jul 20, 2011 3:41 pm

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 %...
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor Tharis em Quarta Jul 20, 2011 4:35 pm

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. ;)
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Python e a Memória (RAM)

Mensagempor Bruno Oliveira em Quarta Jul 20, 2011 7:37 pm

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... :)
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor filipematos em Quarta Jul 20, 2011 7:44 pm

Esse foi um dos que desisti :) O que é o brute force(se é que é algo)?
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python e a Memória (RAM)

Mensagempor Bruno Oliveira em Quarta Jul 20, 2011 11:45 pm

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:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Próximo

Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante