TStream e consumo de memória
20/01/2006
0
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
Posts
20/01/2006
Thomaz_prg
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.
21/01/2006
Vinicius2k
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+
21/01/2006
Vinicius2k
Sobe...
Clique aqui para fazer login e interagir na Comunidade :)