Array
(
)

TStream e consumo de memória

Vinicius2k
   - 20 jan 2006

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 !


Thomaz_prg
   - 20 jan 2006

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.


Vinicius2k
   - 21 jan 2006

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+


Vinicius2k
   - 21 jan 2006


Citação:
Algum dos colegas saberia me dizer se TCompressionStream pode ser utilizada para comprimir TMemoryStream? Como?

Sobe...