Documentmodus: visueel opslaan gebruikt kwadratisch geheugen en tijd voor veel regels #1651
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1651
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Probleem
Een visuele save bouwt tweemaal een volledige LCS-matrix van (m+1) × (n+1) integers: eerst original↔baseline en daarna baseline↔current. Bij documenten met veel korte regels groeit dit kwadratisch en kan Opslaan de UI langdurig blokkeren of het proces uit geheugen laten lopen. De algemene documentlimiet is 32 MiB en begrenst het aantal regels niet voldoende.
Reproductie
Verwacht
Opslaan schaalt begrensd/lineair of gebruikt een diff-algoritme zonder volledige kwadratische matrix.
Technische aanwijzing
lib/utils/source_patcher.dart:_alignLines en _lcsDiff maken elk List<List> van alle regelparen.
Gevonden bij audit van commit
d439638c6b.Triage: accepted
Bevestigd tegen
main(e93ef205c)._alignLines(lib/utils/source_patcher.dart) en_lcsDiffbouwen elk een volledigeList<List<int>>van(m+1) × (n+1). Bij 30.000 regels aan beide zijden is dat ~900 miljoenint-cellen per matrix. De documentgrens van 32 MiB begrenst het aantal regels niet: een bestand van 32 MiB met alleena\ntelt 16 miljoen regels.Oplossingsrichting
Drie stappen, in deze volgorde — de eerste doet in de praktijk het meeste werk:
Map<String, List<int>>) om ankers te vinden en daartussen te patchen. Degraderen in plaats van hangen.compute()-isolate, net als de import (zieImport off-isolate). Opslaan mag even duren; de interface mag niet stilvallen.Regressietest (verplicht)
test/source_patcher_test.dart: document van ~50.000 korte regels met één gewijzigde regel — assertie op de uitkomst (byte-getrouw op alle andere regels) plus een begrensde looptijd. Voor die tweede: injecteer en bevries een klok in plaats van de marge te verbreden (zieLoad-flaky timingtest), of tel de matrixcellen achter een testhaak.Kosten
Eén bestand. Stap 1 en 2 samen een halve dag inclusief tests; stap 3 is los te doen en raakt
document_save_actions.dart(die danawait).Prioriteit
Middelhoog. Het treft alleen grote documenten, maar het neemt de hele interface mee, en de grens ligt lager dan de documentgrens suggereert.