Tamanho de um array em Bytes

588 views
Skip to first unread message

leonardo mateus

unread,
Oct 19, 2009, 8:42:41 AM10/19/09
to ph...@googlegroups.com
Olá pessoa,

Alguém sabe me dizer alguma função que me retorne o espaço gasto na memória em bytes (ou bits, tanto faz) ocupado por um array. Estou fazendo um algoritmo para Sistema de Busca e preciso gerenciar a memória.

Muito Grato.

--
-----------------------------------------------------------
Leonardo Mateus
Analista de Sistemas / Designer
Faculdades Santo Agostinho
Divisão de Tecnologia de Informação
3641 / 3620
-----------------------------------------------------------

Rafael Nogueira

unread,
Oct 19, 2009, 9:29:55 AM10/19/09
to ph...@googlegroups.com
 
Cara,
 
dei uma olhada na documentação e não achei inicialmente nenhuma função para isso, mas uma ideia tosca que eu tive aki( ao menos para testar esse array em ambiente de desenvolvimento ) seria usar a função memory_get_usage() para obter a quantidade de memória utilizada pelo seu script como um todo.
 
algo semelhante ao seguinte:
 
<?php
 
$meuArray = ??? /* array gigante que voce quer medir o tamanho */
 
$MemoriaAlocada1 = memory_get_usage(); /* Total de memoria que seu script esta utilizando, incluindo o array gigante seu */
 
$copiaDeTeste = $meuArray(); /* cria uma cópia do seu array visando criar um novo elemento na memoria com o mesmo tamanho dele */
 
$MemoriaAlocada2 = memory_get_usage(); /* Total de memoria que seu script usa contendo duas cópias do array gigante */
 
unset$copiaDeTeste ); /* Liberar um cadim de memoria no seu server né??? */
 
/* Tamanho do seu array pela diferenca de memoria alocada pelo script nos dois momentos */
$tamanhoDoArrayEmBytes = $MemoriaAlocada2 - $MemoriaAlocada1;
 
...
?>
 
Posso até ta reiventando a roda, mas acho q isso pode funcionar para seu problema. Apenas duas observações são:
 
1 - nao to lembrado se ao fazer uma atribuição de um array para o outro, tipo $a2 = $a1
isso é feito com uma nova alocação na memoria para o novo array($a2 neste caso) ou se é apenas feita uma referencia ao primeiro array( algo semelhante à necessidade de se usar a função Clone() para efetivamente duplicar um objeto);
 
2 - Verificar se a função memory_get_usage() retorna o total de memoria utilizado pelo seu script ou o total de memoria utilizado pelo PHP todo no seu server( tipo, várias requisições de várias páginas simultaneamente )
 
Acho que com isso ae dá pra começar a resolver seu problema
 
 
[]'s
--
Rafael Nogueira Santos
Analista de Tecnologia de Informação
CONFEA - CREA-MG

Herberth Amaral

unread,
Oct 19, 2009, 11:48:19 AM10/19/09
to ph...@googlegroups.com
Isso não é uma coisa trivial, mas a solução do Rafael é criativa. No entanto, em um ambiente concorrente (múltiplas páginas podem ser requisitadas em um certo tempo), a alocação de memória fica sendo uma coisa bem volátil... seu script pode ser interrompido antes do $MemoriaAlocada2 = memory_get_usage();   e quando ele voltar a ser executado, a quantidade de memória terá variado, produzindo um resultado inconsistente...

Uma outra forma de verificar isso é através de uma função que varra todo o array... nem quero ver a complexidade disso, pq há várias coisas a se considerar (qual é o tamanho de um int? e de uma string? como itero sobre um objeto?).

Resumindo: se não for algo crítico, eu fico com a solução do Rafael =)

2009/10/19 Rafael Nogueira <raf...@gmail.com>

Leonardo Mateus

unread,
Oct 20, 2009, 8:22:35 AM10/20/09
to PHP MG
E aí rafa!

Cara.... eu testei e não percebi nenhum problema quanto as
observações. Nem mesmo quanto aos acessos simultâneos, o resultado
permaneceu o mesmo. Fiz uma modificação no código para evitar algum
tipo de apontamento: Veja:

<?php

$MemoriaAlocada1 = memory_get_usage();
echo("Memoria alocada inicial: ".round($MemoriaAlocada1 / 1024, 2)."
KB<br />");

$xml = simplexml_load_file("cacm.xml");
foreach($xml as $doc) $meuArray[] = $doc->TEXT;

$MemoriaAlocada2 = memory_get_usage();
echo("Memoria alocada final: ".round($MemoriaAlocada2 / 1024,
2)."<br />");

unset($meuArray);
$tamanhoDoArrayEmBytes = $MemoriaAlocada2 - $MemoriaAlocada1;

$tamanhoDoArrayEmBytes = round($tamanhoDoArrayEmBytes / 1024, 2)."
KB";
echo("Tamanho do Array em Bytes: ".$tamanhoDoArrayEmBytes);

?>

Usei um XML para gerar informação e, literalmente, "gastar" a
memória... O resultado foi este:

-- Memoria alocada inicial: 61.51 KB
-- Memoria alocada final: 926.21
-- Tamanho do Array em Bytes: 864.7 KB

Agora vou tentar aplicar de fato no meu problema real.... e te passo o
feedback depois.... =D
Valeu pela dica vey!!

Abraços!!!

Leonardo Mateus

unread,
Oct 20, 2009, 8:30:31 AM10/20/09
to PHP MG
E aí herberth!

Eu testei a ideia de rafa, e pelo menos localmente, não houve
alteração de resultado em acessos simultâneos... Como meu problema
também vai rodar localmente (somente processamento e memória), acho
que atende... Agora vou fazer a implementação no problema real e
verificar se atende de fato. Realmente fazer verificação de tipagem em
PHP é mais complicado, pelo fato do PHP não ter isso bem definido.

Mas valeu a dica!! Abraços!! :P

On 19 out, 13:48, Herberth Amaral <herberthama...@gmail.com> wrote:
> Isso não é uma coisa trivial, mas a solução do Rafael é criativa. No
> entanto, em um ambiente concorrente (múltiplas páginas podem ser
> requisitadas em um certo tempo), a alocação de memória fica sendo uma coisa
> bem volátil... seu script pode ser interrompido antes do $MemoriaAlocada2 =
> memory_get_usage();   e quando ele voltar a ser executado, a quantidade de
> memória terá variado, produzindo um resultado inconsistente...
> Uma outra forma de verificar isso é através de uma função que varra todo o
> array... nem quero ver a complexidade disso, pq há várias coisas a se
> considerar (qual é o tamanho de um int? e de uma string? como itero sobre um
> objeto?).
>
> Resumindo: se não for algo crítico, eu fico com a solução do Rafael =)
>
> 2009/10/19 Rafael Nogueira <rafa...@gmail.com>

Charles Schaefer

unread,
Oct 20, 2009, 10:12:43 AM10/20/09
to ph...@googlegroups.com
Cara toma cuidado:


<?php

       $MemoriaAlocada1 = memory_get_usage();
       echo("Memoria alocada inicial: ".round($MemoriaAlocada1 / 1024, 2)."
KB<br />");

       $xml = simplexml_load_file("cacm.xml");
       foreach($xml as $doc) $meuArray[] = $doc->TEXT;

       $MemoriaAlocada2 = memory_get_usage();
       echo("Memoria alocada final: ".round($MemoriaAlocada2 / 1024,
2)."<br />");

       unset($meuArray);
       $tamanhoDoArrayEmBytes = $MemoriaAlocada2 - $MemoriaAlocada1;



Não está sendo calculado o tamanho aproximado do array, mas do array + do XML como objeto ($xml = simplexml_load_file(...) ). Acho que o melhor, nesse caso, seria fazer:


$xml = simplexml_load_file("cacm.xml");
$MemoriaAlocada1 = memory_get_usage();
foreach($xml as $doc) $meuArray[] = $doc->TEXT;
$MemoriaAlocada2 = memory_get_usage();
// .. o resto do código


--
Charles Schaefer
UaiTI (www.uaiti.com.br)
Email: charles...@gmail.com
          cha...@uaiti.com.br
Tels.: +55 31 9317-2862
        +55 31 3785-1118

ATENÇÃO: Não imprima este e-mail. A natureza agradece. E seu bolso também.
WARNING: Don't print this e-mail. The nature is thankful. And your money too.

Leonardo Mateus

unread,
Oct 20, 2009, 10:25:28 AM10/20/09
to PHP MG
Valeu pela dica Charles!!....
Carregar o XML antes e depois fazer o memory_get_usage();
Saquei a ideia... Valeu!!

On 20 out, 12:12, Charles Schaefer <charlesschae...@gmail.com> wrote:
> Cara toma cuidado:
>
> <?php
>
>
>
>
>
> >        $MemoriaAlocada1 = memory_get_usage();
> >        echo("Memoria alocada inicial: ".round($MemoriaAlocada1 / 1024, 2)."
> > KB<br />");
>
> >        $xml = simplexml_load_file("cacm.xml");
> >        foreach($xml as $doc) $meuArray[] = $doc->TEXT;
>
> >        $MemoriaAlocada2 = memory_get_usage();
> >        echo("Memoria alocada final: ".round($MemoriaAlocada2 / 1024,
> > 2)."<br />");
>
> >        unset($meuArray);
> >        $tamanhoDoArrayEmBytes = $MemoriaAlocada2 - $MemoriaAlocada1;
>
> Não está sendo calculado o tamanho aproximado do array, mas do array + do
> XML como objeto ($xml = simplexml_load_file(...) ). Acho que o melhor, nesse
> caso, seria fazer:
>
> $xml = simplexml_load_file("cacm.xml");
>
> > $MemoriaAlocada1 = memory_get_usage();
>
> foreach($xml as $doc) $meuArray[] = $doc->TEXT;
> $MemoriaAlocada2 = memory_get_usage();
> // .. o resto do código
>
> --
> Charles Schaefer
> UaiTI (www.uaiti.com.br)
> Email: charlesschae...@gmail.com
>           char...@uaiti.com.br
Reply all
Reply to author
Forward
0 new messages