DNATech :: 🚀 DNATech x TOTVS: Benchmark da Leitura de Arquivos com FWFileReader

_Créditos das imagens: ChatGPT

# 🚀 DNATech x TOTVS: Benchmark da Leitura de Arquivos com FWFileReader

## Contexto

A classe [FWFileReader](https://tdn.totvs.com.br/display/public/framework/FWFileReader), fornecida pela TOTVS, promete leitura eficiente de arquivos texto, linha a linha, sem “onerar o IO”.

Na prática, porém, identificamos **erros grotescos** (como veremos abaixo) e uma **queda drástica de performance**, principalmente quando os arquivos estão no **cliente**.

Para superar essas limitações, criamos as classes **FileNavigator** e **FileReadLine**, disponíveis na biblioteca [DNATech](https://github.com/DNATechByNaldoDJ).
Os testes mostram ganhos expressivos de **performance, integridade e consistência**.

---

## 🐞 Issues Encontradas na FWFileReader

Durante a análise foram reportados os seguintes problemas:

* [🐞 Bug: FWFileReader - Finais de linha não removidos corretamente](https://github.com/naldodj/totvs-protheus-open-issues/issues/4)
* [🐛 FWFileReader trata quebras de linha de forma incorreta, resultando em leituras de dados inconsistentes](https://github.com/naldodj/totvs-protheus-open-issues/issues/5)
* [🐞 FWFileReader()\:GetFileSize() retorna `nil` em vez de `0` quando arquivo inexistente](https://github.com/naldodj/totvs-protheus-open-issues/issues/6)
* [🐞 FWFileReader()\:HasLine() processa 1 linha mesmo com arquivo inexistente](https://github.com/naldodj/totvs-protheus-open-issues/issues/7)

---

## 🔍 Metodologia

* Testes com arquivos reais (`FUNCIONARIO.CSV`, `DET_RESCIS.CSV`, `SIT_AFAST_FUNC.CSV` etc.).
* Leituras **sequenciais** e **não-sequenciais**.
* Comparativo **Servidor x Cliente**.
* Métricas: tempo total de processamento, tempo de leitura, integridade do hash (`StrHash`) e desvio padrão dos tempos.

---

## 📊 Resultados

### ⏱️ Comparativo de Tempo de Processamento

| Reader        | Contexto | Tempo Total (ms) |
| ------------- | -------- | ---------------- |
| FileNavigator | Servidor | **73**           |
| FileReadLine  | Servidor | **75**           |
| FWFileReader  | Servidor | 81               |
| FT\_\*        | Servidor | 74               |
| FileNavigator | Cliente  | **6.050**        |
| FileReadLine  | Cliente  | **6.220**        |
| FWFileReader  | Cliente  | 257.000          |

---

### 📖 Comparativo de Tempo de Leitura (Reader)

| Reader        | Contexto | Tempo Reader (ms) |
| ------------- | -------- | ----------------- |
| FileNavigator | Servidor | **3,5**           |
| FileReadLine  | Servidor | **4,8**           |
| FWFileReader  | Servidor | 11,4              |
| FT\_\*        | Servidor | 5,1               |
| FileNavigator | Cliente  | **5.290**         |
| FileReadLine  | Cliente  | **5.480**         |
| FWFileReader  | Cliente  | 255.000           |

---

## 📌 Casos com dados perdidos ou inconsistentes

* **TOTVS FT\_**\*

  * Processou **7356 linhas** em vez de 3678 → **linhas duplicadas**.
  * Resultado: **hash divergente** (`StrHash` não bateu com o esperado).
  * 🔴 **Perda de integridade**: os dados lidos **não representam o arquivo original**.

* **TOTVS FWFileReader**

  * Além da lentidão absurda no cliente, ele **traz dados inconsistentes**.
  * Problema registrado: [Issue #5 – FWFileReader trata quebras de linha de forma incorreta](https://github.com/naldodj/totvs-protheus-open-issues/issues/5).
  * Necessário “sanitizar” manualmente as linhas para remover caracteres ocultos (`cCRH10`, `cCRH13`), senão o **hash da linha não bate**.
  ```xBase
//Fix Return Error GetLine(.T.)
cLine:=oFileReader:GetLine(.T.)
//FWFILEREADER tem Bug e retorna cCRH10 ou cCRH13 indevidamente e não bate o Hash da Linha
if (cCRH10$cLine)
    cLine:=StrTran(cLine,cCRH10,"")
endif
if (cCRH13$cLine)
    cLine:=StrTran(cLine,cCRH13,"")
endif
  
  ```
  * Outras falhas estruturais já conhecidas:

    * `GetFileSize()` retornando **nil** em vez de `0`.
    * `HasLine()` processando **linha fantasma** em arquivo vazio.

* **DNATech FileNavigator / FileReadLine**

  * ✅ Todos os testes entregaram **hash OK** (dados íntegros).
  * ✅ Nenhuma leitura duplicada.
  * ✅ Nenhum caractere extra ou inconsistente.

---

👉 Ou seja: o problema **não é só performance** —

* **FT\_**\* corrompe a leitura duplicando dados.
* **FWFileReader** retorna linhas inconsistentes, exigindo correção manual.
* **DNATech** entrega **velocidade + integridade garantida**.

---

## 📌 Conclusões

* ✅ **DNATech entrega até 40x mais performance no cliente.**
* ✅ **Integridade dos dados garantida** (hash idêntico em todas execuções).
* ⚠️ **FWFileReader falha em consistência e performance**, especialmente fora do servidor.
* 🚀 **FileNavigator/FileReadLine permitem leitura não-sequencial e performática**.

---

📂 Códigos e benchmarks completos:
👉 [GitHub - DNATech AdvPL](https://github.com/DNATechByNaldoDJ)
👉 [Testes FileIO](https://github.com/naldodj/naldodj-DataSul2TotvsProtheus/tree/main/fileIO)

---

💡 *Se você lida com grandes volumes de arquivos no Protheus, já sabe: DNATech é sinônimo de velocidade, integridade e inovação.*

---

#DNATech #TOTVS #FWFileReader #FileNavigator #FileReadLine #Performance #Integridade #Benchmark #Protheus #Inovacao

---

📊 Tempo de Processamento (com integridade)
📖 Tempo de Leitura (com integridade)

* ✅ Verde = dados íntegros
* ⚠️ Laranja = inconsistentes
* ❌ Vermelho = duplicados

Torne-se um Sponsor: 🥊(дави)={0.5x[(Налдо)+(Алине)]}🥊

Comentários

Postar um comentário

Postagens mais visitadas