Ir para conteúdo
  • Cadastre-se

dev botao

ValidarBlocoX demora mais de 30 minutos para executar.


_asseinfo
  • Este tópico foi criado há 2212 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Gente, estou tentando fazer o envio do arquivo de estoque do Bolco X, porém o arquivo está meio grande, já que é o que acontecerá em boa parte dos clientes. Ao utilizar o método Executar do ValidarBlocoX, ele demora mais de 30 minutos, para um arquivo de 4Mb. Comecei a inspecionar qual era o problema e descobri que a demora, é devido ao StringReplace que é utilizado para substituir < e > por &lt e &gt.

Dei uma pesquisada na internet e inspecionei o próprio código do método StringReplace do SysUtils e o tempo aumenta exponencialmente com o aumento do tamanho do arquivo. Assim, fazendo que a substituição dos caracteres utilizada pelo ParseText do ACBrUtils seja muito lento para os casos dos arquivos de estoque do Bloco X. Como vocês costumam resolver este problema de demora? Ou simplesmente aceitam o tempo e deixam executar assim?

Link para o comentário
Compartilhar em outros sites

Como é permitido somente arquivos de até 2Mb aqui, estou adicionando um link do Drive.

 

https://drive.google.com/file/d/1liob3ntzgUSitKK6EPByo9WJn9U7Dzm0/view?usp=sharing

 

Pelos meus testes, se paginar o replace com algo do tipo:

function StringReplacePaginado(const texto, PadraoAntigo: string; PadraoNovo: string; flags: TReplaceFlags): string;
const
  NUMERO_DE_CARACTERES = 131072;
var
  NovoTexto: string;
  Linha: string;
  Linhas: Integer;
  i: Integer;
begin
  Linhas := Length(Texto) div NUMERO_DE_CARACTERES + 1;
  NovoTexto := '';
  for i := 0 to Linhas - 1 do
  begin
    Linha := Copy(Texto, 1 + (NUMERO_DE_CARACTERES * i), NUMERO_DE_CARACTERES);
      
    Linha := StringReplace(Linha, PadraoAntigo, PadraoNovo, flags);

    NovoTexto := NovoTexto + Linha;
  end;

  Result := NovoTexto;
end;

E utilizar dessa forma

AStr := StringReplacePaginado(AStr, '<', '&lt;'  , [rfReplaceAll]);

Ele diminui de 34 minutos, no processo inteiro, para 30 segundos, demonstrando ser 68x mais rápido.

Editado por _asseinfo
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2212 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.