Zstandard - Algoritmo de compressão

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
André Corrêa
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 03 Nov 2015 07:46
Localização: Caraguatatuba/SP

Zstandard - Algoritmo de compressão

Mensagem por André Corrêa »

Boa tarde,

Utilizamos atualmente as funções de compactação/descompactação do próprio Harbour para salvar diversos arquivos, e nunca tivemos problema.
Porém, em alguns clientes com muitos arquivos (mais de 400 mil), principalmente XMLs de documentos fiscais, o processo tem se tornado muito lento.
Pesquisando algoritmos ou bibliotecas mais modernas e eficientes, encontramos o Zstd ( Zstandard ), criado pelo Facebook e utilizado por diversas
grandes empresas que trabalham com quantidades enormes de dados. Analisando os benchmarks e casos de uso, parece ser bastante eficiente, ficando
entre os mais rápidos e mantendo boas taxas de compressão. No site https://facebook.github.io/zstd/#other-languages existem exemplos e
wrapers para diversas linguagens, incluindo C, Delphi, VB6, porém, estou com dificuldade em aproveitá-los para que possa utilizar no Harbour.

Tentei o seguinte:
Incluí os cabeçalhos zstd.h e stddef.h, carreguei a dll com HB_LibLoad e chequei o valtype, que retornou "P", ou seja, ela foi carregada corretamente.
Tentei chamar a função ZSTD_Compress com HB_Dyncall, conforme abaixo, mas acusa erro de GPF:

Código: Selecionar todos

hDll := HB_LibLoad(Application:cDirectory+"libzstd.dll")
hb_dynCall( { "ZSTD_compress", hDll, HB_DYN_CALLCONV_STDCALL }, Application:cDirectory+"teste.txt" )

Acredito que falte passar algum parâmetro para a função, mas não consegui identificar como fazer.
Se alguém puder ajudar a traduzir um dos exemplos para o Harbour, ou ao menos indicar o que falta ou o que está errado, ficarei muito grato.

Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Zstandard - Algoritmo de compressão

Mensagem por JoséQuintas »

Talvez somente no Harbour 3.4 que é mais padronizado, mas mesmo assim, precisa ver exatamente o tipo de cada variável.
Há diversos tipos numéricos, não são todos iguais, e passar errado dá GPF.
Talvez o fonte pra VB6 seja o mais indicado.

Mas 400.000 documentos... difícil alguma coisa rápida.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Zstandard - Algoritmo de compressão

Mensagem por JoséQuintas »

Código: Selecionar todos

Private Declare Function ZSTD_compress Lib "libzstd" Alias "_ZSTD_compress@20" (ByVal ptrToDstBuffer As Long, ByVal dstBufferCapacityInBytes As Long, ByVal constPtrToSrcBuffer As Long, ByVal srcSizeInBytes As Long, ByVal cCompressionLevel As Long) As Long

Private Declare Function ZSTD_compress Lib "libzstd" Alias "_ZSTD_compress@20"

Isso indica que PARA O VB a função é ZSTD_compress
Fica dentro da DLL libzstd
O nome interno, dentro da DLL, é "_ZSTD_compress@20"

ByVal indica valor, caso fosse ByRef seria por referência (@ no Harbour)

Tudo está As Long, o que indica número inteiro longo, número inteiro no Harbour

Só que, se não me engano, ptr é ponteiro... e aí entra criar uma área de memória pra isso, com um tamanho mínimo obrigatório, e converter o ponteiro pra numérico.... complicou.... até porque falta informação sobre essa área de memória.

Sei lá... vai ser muita leitura e muito trabalho.
Se fosse pra mim, preferia deixar o original do Harbour, e nem perder tempo com isso.
Talvez.... mas talvez... tentar acelerar o do Harbour, reduzindo acesso a disco.
Mas é muito trabalho, pra talvez acelerar, ou talvez só perder tempo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Zstandard - Algoritmo de compressão

Mensagem por JoséQuintas »

Comece com um simples:

Código: Selecionar todos

Private Declare Function ZSTD_versionNumber Lib "libzstd" Alias "_ZSTD_versionNumber@0" () As Long
Vai retornar a versão.

AH é... 400.000 XMLs....
Será que 32 bits é suficiente? ou 64 bits?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Zstandard - Algoritmo de compressão

Mensagem por JoséQuintas »

Pergunta meio idiota....

Por acaso pegou algum utilitário pronto, indicado lá, pra testar se vai valer a pena?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Zstandard - Algoritmo de compressão

Mensagem por wmanesco »

Será que não vale a pena pegar em C, e utilizar a API em C do harbour para criar a ponte? Acho que vale mais a pena...

Normalmente utilizo assim para utilizar ".so" e algumas dlls com tipo mais complexo
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Zstandard - Algoritmo de compressão

Mensagem por JoséQuintas »

O melhor mesmo é pegar um programa pronto e fazer o teste comparativo.

É esse resultado que vai dizer se vale a pena ou não qualquer outra coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Zstandard - Algoritmo de compressão

Mensagem por rochinha »

Amiguinhos,

wmanesco
Não sei se ajuda, mas dê uma olhada nestes tópico compressão/des-compressão de string e texto de/para Base64.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Zstandard - Algoritmo de compressão

Mensagem por wmanesco »

Ola.

Eu acho que a questão seria usar o método Zstandard (que pelo que entendi trata-se de algo novo e que possui escritores em C). Pensando nisso, caso ele decida por utilizar, na minha visão a forma mais facil é pegar o fonte que foi feito em C, utilizar a hbapi e criar uma ponte para utilizar no harbour. Não entrei no mérito de ser ou não melhor que algo...

Até mais
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Zstandard - Algoritmo de compressão

Mensagem por asimoes »

Olá,

Procure por http://www.nirsoft.net/utils/dll_export_viewer.html

DLL Export Viewer

Com esse utilitário vai conseguir ler os métodos dessa dll

Esse é pago: http://www.pe-explorer.com/peexplorer-t ... n-view.htm
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
André Corrêa
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 03 Nov 2015 07:46
Localização: Caraguatatuba/SP

Zstandard - Algoritmo de compressão

Mensagem por André Corrêa »

Bom dia,

Pessoal, obrigado pelas respostas.

JoséQuintas, vou gerar os testes comparativos e postar os resultados aqui.

wmanesco, também acho que seria o ideal, mas ainda não tenho o conhecimento
necessário para criar os wrapers em C.

asimoes, muitíssimo obrigado pela indicação do utilitário, era exatamente o que
estava procurando. Vou testá-lo e tentar chegar a algum resultado.

Rochinha, já utilizamos a compressão das strings para base 64, o que demora, é
a compactação dos arquivos em um arquivo .ZIP.

Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar do usuário
André Corrêa
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 03 Nov 2015 07:46
Localização: Caraguatatuba/SP

Zstandard - Algoritmo de compressão

Mensagem por André Corrêa »

JoséQuintas,

Fiz testes utilizando os utilitários já compilados dos compactadores ZStandard e LZ4 e aparentemente, não vale o esforço.
Acredito que os tempos e tamanhos do arquivo final ficaram muito próximos, devido à quantidade e formato dos arquivos (texto).
Testei compactando cerca de 300 mil arquivos, sendo em sua maioria, XMLs de documentos fiscais. Utilizei as taxas médias
de compactação de cada biblioteca.
O tempo varia um pouco em decorrência do uso da CPU por outros aplicativos ou processos.

Seguem os resultados:

O HB_ZipFile() levou entre 15 e 20 minutos.
O ZStandard levou entre 15 e 25 minutos.
O LZ4 levou entre 14 e 19 minutos.

Percebi que o que gera o maior gargalo, como você já havia adiantado, é mesmo o uso do disco.
Como são muitos arquivos, haveria algum meio de diminuir o acesso ao disco?

Atenciosamente,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Responder