TStream e consumo de memória

20/01/2006

0

Colegas,

Terminei ontém o Preview de impressão para meus componentes (VDOPrint), porém não estou muito satisfeito com o consumo de memória.

A lógica seguida é a seguinte, quando a impressão é enviada para o preview:

1. Cada página do Preview é uma TStringStream.

2. Para cada bloco de texto enviado é criada uma classe para armazenar as definições de formatação. Quanto maior o número de blocos enviados, maior a quantidade de objetos desta classe consumindo memória.

3. Quando a página é renderizada para a tela, analizo cada bloco de texto daquela página escrevendo na tela o conteúdo da TStringStream já formatado. O mesmo processo é efetuado na renderização para a impressora.

Ao reavaliar o código, obtive algum ganho de memória substituindo records e ponteiros por classes, mas não foi um ganho muito expressivo.

A conclusão é : cada página do preview (alimentada para testes com aproximadamente 5.000 caracteres e cerca de 250 blocos de texto por página) consome em média de 89K de memória.
Fiz um teste com relatório de 1.000 páginas (é absurdamente grande, eu sei) e chega a consumir quase 90 MB de memória.

Os colegas poderiam opinar se este consumo está alto ou normal? Quanto consome cada página do Rave, por exemplo?

Cheguei a pensar em usar TCompressionStream (ZLIB) para armazenar as páginas, mas ainda não implementei nada... o que vocês acham?

Se acharem que a lógica pode ser melhorada a fim de otimizar o uso da memória, sugestões serão bem vindas.

Obrigado !


Vinicius2k

Vinicius2k

Responder

Posts

20/01/2006

Thomaz_prg

E aí Vinicius tudo blz? Espero que sim...

Cara, fiz alguns testes usando QReport, Fortes e o Free Rep, e a memória consumida ficou em torno disso mesmo. Tentei simular mais ou menos o mesmo teste que você fez, e aconteceu que, o consumo de memória foi esse mesmo (usando QR consumiu um pouco mais).

Na minha opinião, e, meus mais sinceros parabéns, pela sua iniciativa.


Responder

21/01/2006

Vinicius2k

Olá Thomaz !

Muito obrigado pelos testes !

Bem, se esta é a média dos ´grandes´, o VDOPrint ficou melhor. :)

Ao menos para mim foi uma novidade... Consegui reduzir a memória ocupada por cada página para cerca de 40 Kb para Laser e Inkjet e 57 Kb para Matriciais. O mesmo relatório de 1.000 páginas ocupa agora +/- 40 Mb.

A novidade ficou por conta da substituição das Streams das páginas de TStringStream para TMemoryStream. Com 2 ou 3 linhas a mais de código nos métodos de leitura e escrita das páginas, eu passei a utilizar TMemoryStream.

Honestamente, não achei que faria tanta diferença e optei pela TStringStream inicialmente para facilitar a manipulação do texto.

Ainda gostaria de tentar reduzir mais utilizando TCompressionStream, mas ainda não consegui implementar corretamente de forma a comprimir um TMemoryStream. Há bastante tempo eu a utilizo para comprimir arquivos (TFileStream), mas não estou conseguindo fazê-la comprimir TMemoryStream.

Algum dos colegas saberia me dizer se TCompressionStream pode ser utilizada para comprimir TMemoryStream? Como?

T+


Responder

21/01/2006

Vinicius2k

Algum dos colegas saberia me dizer se TCompressionStream pode ser utilizada para comprimir TMemoryStream? Como?

Sobe...


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar