Olá pessoal,
eu preciso que meu código *verifique a memória do micro que o executará*,
ja procurei, mas nao achei nada no python q verifique isso pra mim...
alguem sabe de algum métodos, um meio de descobrir?
ou como importar a api do windows e do linux q contenha uma funçao para
verificar a memoria,
sei lá ou coisa parecida...
Aguardo uma luz no fim do túnel :-)
Anderson
[As partes desta mensagem que não continham texto foram removidas]
2009/8/27 Anderson Silva <negoratinho@gmail.com>:
>
>
> Olá pessoal,
>
> eu preciso que meu código *verifique a memória do micro que o executará*,
> ja procurei, mas nao achei nada no python q verifique isso pra mim...
>
> alguem sabe de algum métodos, um meio de descobrir?
>
> ou como importar a api do windows e do linux q contenha uma funçao para
> verificar a memoria,
> sei lá ou coisa parecida...
>
> Aguardo uma luz no fim do túnel :-)
>
> Anderson
>
No Linux você pode ler o /proc/meminfo. Um dia quando estava
escrevendo as minhas primeiras linhas de Python fiz essa função:
http://p.oitobits.net/view/694.txt
Provavelmente pode ser feito de algum jeito mais bonito.
--
Vinícius Figueiredo
Opa,
complementando, meu amigo Arnaldo (egghunt) me deu a seguinte dica pra pra
conseguir esses dados no Windows:
<code>
import ctypes
import _winreg
import win32com.client
def _ram(self):
kernel32 = ctypes.windll.kernel32
c_ulong = ctypes.c_ulong
class MEMORYSTATUS(ctypes.Structure):
_fields_ = [
('dwLength', c_ulong),
('dwMemoryLoad', c_ulong),
('dwTotalPhys', c_ulong),
('dwAvailPhys', c_ulong),
('dwTotalPageFile', c_ulong),
('dwAvailPageFile', c_ulong),
('dwTotalVirtual', c_ulong),
('dwAvailVirtual', c_ulong)
]
memoryStatus = MEMORYSTATUS()
memoryStatus.dwLength = ctypes.sizeof(MEMORYSTATUS)
kernel32.GlobalMemoryStatus(ctypes.byref(memoryStatus))
return (memoryStatus.dwTotalPhys, memoryStatus.dwAvailPhys)
</code>
Espero que te ajude tb.
Tkm
2009/8/27 Vinícius Figueiredo <viniciusfs@gmail.com>
>
>
> 2009/8/27 Anderson Silva <negoratinho@gmail.com <negoratinho%40gmail.com>
> >:
>
> >
> >
> > Olá pessoal,
> >
> > eu preciso que meu código *verifique a memória do micro que o executará*,
> > ja procurei, mas nao achei nada no python q verifique isso pra mim...
> >
> > alguem sabe de algum métodos, um meio de descobrir?
> >
> > ou como importar a api do windows e do linux q contenha uma funçao para
> > verificar a memoria,
> > sei lá ou coisa parecida...
> >
> > Aguardo uma luz no fim do túnel :-)
> >
> > Anderson
> >
>
> No Linux você pode ler o /proc/meminfo. Um dia quando estava
> escrevendo as minhas primeiras linhas de Python fiz essa função:
>
> http://p.oitobits.net/view/694.txt
>
> Provavelmente pode ser feito de algum jeito mais bonito.
>
> --
> Vinícius Figueiredo
>
>
[As partes desta mensagem que não continham texto foram removidas]
Como ficaria então uma função independente de plataforma, a meu ver o
ideal.
> 2009/8/27 Vinícius Figueiredo <viniciu...@gmail.com>
>
>
>
>
>
> > 2009/8/27 Anderson Silva <negorati...@gmail.com <negoratinho%40gmail.com>
> > >:
>
> > > Olá pessoal,
>
> > > eu preciso que meu código *verifique a memória do micro que o executará*,
> > > ja procurei, mas nao achei nada no python q verifique isso pra mim...
>
> > > alguem sabe de algum métodos, um meio de descobrir?
>
> > > ou como importar a api do windows e do linux q contenha uma funçao para
> > > verificar a memoria,
> > > sei lá ou coisa parecida...
>
> > > Aguardo uma luz no fim do túnel :-)
>
> > > Anderson
>
> > No Linux você pode ler o /proc/meminfo. Um dia quando estava
> > escrevendo as minhas primeiras linhas de Python fiz essa função:
>
> >http://p.oitobits.net/view/694.txt
>
> > Provavelmente pode ser feito de algum jeito mais bonito.
>
> > --
> > Vinícius Figueiredo
>
> [As partes desta mensagem que não continham texto foram removidas]
2009/8/28 sergio <voyeg3r@gmail.com>:
> Como ficaria então uma função independente de plataforma, a meu ver o
> ideal.
Teria que ser uma função que, nos bastidores, verifica a plataforma e
faz a consulta do jeito que ela precisa ser feita em cada plataforma.
A biblioteca padrão do Python já tem várias funções que funcionam
desta maneira no módulo os. A API é igual para todas as plataformas,
mas por trás existem implementações diferentes.
Um módulo útil para desenvolver tal solução é o platform:
http://docs.python.org/library/platform.html
Note que uma das plataformas mencionadas é "Java".
Não tem jeito, é uma tendência da computação: as plataformas vão
criando abstrações cada vez mais distantes do hardware para
simplificar a vida do programador, em contrapartida obter informações
diretamente do hardware vai ficando cada vez mais complicado.
Por sinal, em relação à pergunta original: Anderson, porque você
precisa saber exatamente qual a quantidade de RAM na máquina?
[ ]s
Luciano
2009/8/28 sergio <voyeg3r@gmail.com>:
>
>
> Como ficaria então uma função independente de plataforma, a meu ver o
> ideal.
>
Continua com duas funções, uma para Windows e outra para Linux mas
cria uma outra função que identifique qual é a plataforma e rode o a
função correta. Qualquer coisa do tipo:
import platform
def get_memory_size():
if platform.system() == "Linux":
get_linux_memory()
elif platform.system() == "Windows":
get_windows_memoy()
--
Vinícius Figueiredo
On Fri, Aug 28, 2009 at 10:17:41AM -0300, Vincius Figueiredo wrote:
> 2009/8/28 sergio <voyeg3r@gmail.com>:
> import platform
>
> def get_memory_size():
> if platform.system() == "Linux":
> get_linux_memory()
> elif platform.system() == "Windows":
> get_windows_memoy()
Ola,
Geralmente eu uso desta forma:
import os
if os.name == 'posix':
"""olha a memoria no proc"""
elif os.name == 'nt':
"""olha a memoria ___nao tenho a minima ideia___"""
Atenciosamente,
--
Marcelo Araujo
araujo@FreeBSD.org
http://www.FreeBSD.org
Any given program costs more and takes longer.
[As partes desta mensagem que não continham texto foram removidas]
Obrigado galera pelas dicas, vou olhar cada sugestao dada...
Luciano respondendo sua pergunta, eu tenho o seguinte problema:
eu trabalho com processamento de texto, e estou verificando a frequencia das palavras em arquivos passados por parametro, e se esse arquivo for muito grande a memoria pode nao ser o suficiente, ai começa a paginar e ja era, enfim o que pensei? Meu codigo faz um pré processamento para saber o tamanho do arquivo e quero fazer com que ele descubra o tamanho da memoria, assim faz uma conta para definir o tamanha maximo permitido para o arquivo, quando ultrapassar ele vai quebrar em partes esse arquivo. Entendeu mais ou menos o que quero fazer?
Obrigado
2009/8/28 anderson_sipolicamp <negoratinho@gmail.com>:
[cut]
> eu trabalho com processamento de texto, e estou verificando a frequencia das
> palavras em arquivos passados por parametro, e se esse arquivo for muito
> grande a memoria pode nao ser o suficiente [cut]
Você provavelmente pode só ler linha a linha o arquivo, com algo tipo:
for linha in open('arquivo.txt').
Desta forma, o arquivo não vai todo pra memória de uma vez.
Uma dica: sempre diga qual é o seu problema original. ;)
[]'s,
Thiago F. Pappacena
Good things come for those who wait...
... and for the efficient people who doesn't wait too, but faster:
Open source, XP, OO, Python, VIM, Bash and Gentoo.
2009/8/28 anderson_sipolicamp <negoratinho@gmail.com>:
> Obrigado galera pelas dicas, vou olhar cada sugestao dada...
>
> Luciano respondendo sua pergunta, eu tenho o seguinte problema:
>
> eu trabalho com processamento de texto, e estou verificando a frequencia das palavras em arquivos passados por parametro, e se esse arquivo for muito grande a memoria pode nao ser o suficiente, ai começa a paginar e ja era, enfim o que pensei? Meu codigo faz um pré processamento para saber o tamanho do arquivo e quero fazer com que ele descubra o tamanho da memoria, assim faz uma conta para definir o tamanha maximo permitido para o arquivo, quando ultrapassar ele vai quebrar em partes esse arquivo. Entendeu mais ou menos o que quero fazer?
Eu acho que você não está indo por um bom caminho, Anderson. Não
entendi porque precisa ler o arquivo inteiro para a memória para
contar a frequencia das palavras...
[ ]s
Luciano
> eu trabalho com processamento de texto, e estou verificando a frequencia das palavras em arquivos passados por parametro, e se esse arquivo for muito grande a memoria pode nao ser o suficiente, ai começa a paginar e ja era, enfim o que pensei? Meu codigo faz um pré processamento para saber o tamanho do arquivo e quero fazer com que ele descubra o tamanho da memoria, assim faz uma conta para definir o tamanha maximo permitido para o arquivo, quando ultrapassar ele vai quebrar em partes esse arquivo. Entendeu mais ou menos o que quero fazer?
Mapear o arquivo em memória (mmap) não é uma opção? Isso esconderia
esse tipo de preocupação do programa.
Og!
Entao Thiago, mas o problema nao é no processamento e sim em um dicionario q vai sendo atualizado, esse dicionario é alimentado e no final escrito em um arquivo, se eu dividir o arquivo de entrada de acordo com a memoria usada, eu nao terei problema com ele.
Anderson
2009/8/28 anderson_sipolicamp <negoratinho@gmail.com>:
>
>
> Entao Thiago, mas o problema nao é no processamento e sim em um dicionario q
> vai sendo atualizado, esse dicionario é alimentado e no final escrito em um
> arquivo, se eu dividir o arquivo de entrada de acordo com a memoria usada,
> eu nao terei problema com ele.
Eu também acho que você está super-complicando. Eu no seu caso usaria
um shelve[1] pra armazenar temporariamente as informações, e usaria a
solução do Thiago, pra ler linha a linha somente. Dessa forma, nem um
arquivo de 155Gb vai te causar dor de cabeça.
[1] http://docs.python.org/library/shelve.html
>
> Anderson
>
>
--
Rodolfo Carvalho
Web Developer
rodolfo.ueg@gmail.com
On Aug 28, 2009, at 11:32 AM, anderson_sipolicamp wrote:
> Obrigado galera pelas dicas, vou olhar cada sugestao dada...
>
> Luciano respondendo sua pergunta, eu tenho o seguinte problema:
>
> eu trabalho com processamento de texto, e estou verificando a
> frequencia das palavras em arquivos passados por parametro, e se
> esse arquivo for muito grande a memoria pode nao ser o suficiente,
> ai começa a paginar e ja era, enfim o que pensei? Meu codigo faz um
> pré processamento para saber o tamanho do arquivo e quero fazer com
> que ele descubra o tamanho da memoria, assim faz uma conta para
> definir o tamanha maximo permitido para o arquivo, quando
> ultrapassar ele vai quebrar em partes esse arquivo. Entendeu mais ou
> menos o que quero fazer?
tu pode usar mmap para mapear o arquivo em memória, e então só a parte
que tu esta lendo vai estar em memória num dado momento (o sis. op.
faz isso pra ti). Assim tu consegue ler um arquivo de qualquer
tamanho, ou pelo menos até a estrutura que tu usa pra guardar as
frequencias ficar grande demais pra memória, algo q não tem como saber
de antemão.
--
Leonardo Santagada
santagada at gmail.com
2009/8/28 anderson_sipolicamp <negoratinho@gmail.com>:
> Entao Thiago, mas o problema nao é no processamento e sim em um dicionario q
> vai sendo atualizado, esse dicionario é alimentado e no final escrito em um
> arquivo, se eu dividir o arquivo de entrada de acordo com a memoria usada,
> eu nao terei problema com ele.
Nesse caso, eu utilizaria um banco de dados para dar "flush" dessa
contagem de tempos em tempos, e zerar o dicionário. ZODB, por exemplo,
tem uma estrutura de BTree bem legal que pode te ajudar,
principalmente se vc armazenar mais do que só a frequência das
palavras.
Aliás, falando em processamento de texto, tome cuidado com a lista de
palavras a serem ignoradas. Boa parte do tamanho do seu dicionário
pode estar sendo usada para guardar palavras que podem não ser
relevantes para sua contagem, como artigos, preposições ("de", "a",
"o", "até"), etc.
[]'s,
Thiago F. Pappacena
Good things come for those who wait...
... and for the efficient people who doesn't wait too, but faster:
Open source, XP, OO, Python, VIM, Bash and Gentoo.
2009/8/28 anderson_sipolicamp <negoratinho@gmail.com>:
> Obrigado galera pelas dicas, vou olhar cada sugestao dada...
>
> Luciano respondendo sua pergunta, eu tenho o seguinte problema:
>
> eu trabalho com processamento de texto, e estou verificando a frequencia das palavras em arquivos passados por parametro, e se esse arquivo for muito grande a memoria pode nao ser o suficiente, ai começa a paginar e ja era, enfim o que pensei? Meu codigo faz um pré processamento para saber o tamanho do arquivo e quero fazer com que ele descubra o tamanho da memoria, assim faz uma conta para definir o tamanha maximo permitido para o arquivo, quando ultrapassar ele vai quebrar em partes esse arquivo. Entendeu mais ou menos o que quero fazer?
O pessoal já comentou algumas soluções, eu gostaria de entra em um
pouco mais de detalhes em algumas delas.
1) A primeira opção é fazer utilizar um "memory map" para ler o
arquivo. Basicamente, esta função trata o arquivo como se ele
estivesse inteiro na memória, utilizando o mesmo sistema de paginação
de memória virtual que o Windows e o Linux utilizam. Somente a parte
que estiver ativa do arquivo fica na memória. O resto fica em disco
mesmo. É assim que vários programas permitem tratar arquivos de
tamanho praticamente ilimitado (digo praticamente, porque os limites
do sistema operacional para o tamanho máximo de arquivo continuam
valendo; não lembro de cabeça mas deve ser algo como 4 GB para a
maioria dos sistemas atuais).
2) Ao invés de particionar o arquivo antes, você pode trabalhar de
forma diferente, avaliando a memória livre enquanto trata os dados. Se
você puder gravar os resultados intermediários e continuar a leitura
de onde parou, poupa o tempo do pré-processamento.
3) Outra idéia seria utilizar um esquema de trabalho diferente do que
você tem hoje, trabalhando com geradores (generators). É uma idéia
incrivelmente simples e poderosa. Basicamente, você estrutura seu
algoritmo de forma que ele seja executado "todo ao mesmo tempo", com
um "pipeline" (não achei termo melhor em português). Se você já
trabalhou com "pipes" no Unix/Linux sabe do que eu estou falando.
Outra referência acadêmica seriam as "co-rotinas", que tem conceitos
parecidos.
A grande vantagem de generators é que eles minimizam a quantidade de
dados em memória, e processam o arquivo de entrada em um passo só.
Note que nem todos os algoritmos se prestam a uma implementação deste
tipo.
Espero ter ajudado, mas como já foi dito aqui - se você puder falar
mais do seu problema, fica mais fácil ajudar. Aliás você se
surpreenderia com o quantidade de respostas que um desafio
interessante traz para a lista...
--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
mail: carribeiro@gmail.com