Van het SyncGallery-team

Van 100.000 bestanden naar een miljoen

Elke app heeft een getal waar de ontwikkelaars stilletjes omheen ontwerpen. Het onze was 100.000 bestanden—tot echte gebruikers kwamen.

Een telefoongalerij die uitgroeit tot een enorm veld van geordende fotominiaturen

Een doel dat royaal aanvoelde

Toen we begonnen met SyncGallery, kozen we een duidelijk prestatiedoel: de app moest snel blijven met 100.000 mediabestanden op een apparaat. We schreven elk algoritme met dat getal in gedachten en testten met bibliotheken van ongeveer die omvang.

Destijds leken 100.000 bestanden royaal. Met 30 foto's per dag, elke dag, duurt het ongeveer negen jaar om dat aantal te bereiken. We waren ervan overtuigd dat niemand er meer dan dat op een telefoon zou bewaren.

Gebruikers bewezen het tegendeel

Kort na de eerste release ontdekten we hoe verkeerd die aanname was. Echte bibliotheken waren veel groter dan ons plafond: jaren aan camera-archieven, foto's die van oudere telefoons en computers waren overgezet, en complete familiecollecties op grote geheugenkaarten. Veel Android-telefoons accepteren nog steeds geheugenkaarten van 512 GB of zelfs 1 TB—ruimte voor bibliotheken die vele malen groter zijn dan ons oorspronkelijke doel.

De app viel niet ineens om bij bestand 100.001—prestatiegrenzen zijn zelden zo beleefd. In plaats daarvan duurden handelingen die direct zouden moeten aanvoelen merkbaar langer, en de ervaring werd steeds slechter naarmate een bibliotheek verder boven het doel uitgroeide. Voor mensen met de grootste bibliotheken—misschien wel degenen die een back-upapp het hardst nodig hebben—was dat niet goed genoeg.

Wat er verandert bij tien keer de schaal

Veel shortcuts die onschuldig zijn bij 100.000 bestanden worden problemen bij een miljoen. Het patroon is steeds hetzelfde: een kostenpost groeit ongemerkt mee met de bibliotheek.

  • Alles in het geheugen houden. Een lijst van 100.000 items past makkelijk in het RAM. Bij tien keer die omvang, vermenigvuldigd over schermen en caches, zorgt geheugendruk voor haperingen en in het ergste geval voor crashes.
  • Elk bestand opnieuw controleren als er maar een paar zijn veranderd. De hele bibliotheek opnieuw bekijken omdat er een handvol foto's is bijgekomen, merk je bij 100.000 bestanden nauwelijks. Bij een miljoen kan dat minutenlang achtergrondwerk betekenen zonder zichtbaar voordeel.
  • Het scherm na elke wijziging bijwerken. Eén update per verwerkt bestand valt in een kleine bibliotheek niet op. Als er tienduizenden wijzigingen tegelijk binnenkomen, kan de interface erdoor bevriezen.
  • Caches eindeloos laten groeien. Een onbegrensde cache gaat uiteindelijk concurreren met de schermen die hij juist sneller moest maken.

Dit zijn geen exotische bugs. Het zijn gewone technische beslissingen die een orde van grootte later niet meer werken.

Herbouwen voor een miljoen

We verhoogden het doel naar een miljoen bestanden en liepen de app opnieuw door met dat getal als nieuwe lat. Een paar regels bepalen nu alles wat we bouwen:

  • Het geheugengebruik gelijk houden terwijl de bibliotheek groeit. De zwaarste lijstschermen laden bestanden nu in vensters uit de database in plaats van alles in het geheugen te houden. Grote afbeeldingscaches zijn begrensd, zodat ze oudere items verwijderen in plaats van eindeloos te groeien. Dit wordt scherm voor scherm doorgevoerd; het is de discipline waarmee we nu bouwen, geen finish die we overal al hebben gehaald.
  • Vergelijken in plaats van opnieuw lezen. Scans houden bij wat er is veranderd in plaats van alles opnieuw te verwerken. Als een cloudprovider een wijzigingsfeed biedt, gebruiken we die wijzigingen in plaats van hele mappen opnieuw op te vragen.
  • De interface nooit laten wachten op de bibliotheek. Zwaar werk draait op de achtergrond in batches. Schermupdates worden gebundeld, zodat een golf van 10.000 wijzigingen geen 10.000 keer opnieuw tekenen veroorzaakt.
  • Meten op echte apparaten met echte bibliotheken. Profileren verving gokken. De grootste winst kwam van plekken die we zonder meten nooit hadden verdacht.

Snel is een gewoonte, geen mijlpaal

De belangrijkste verandering was niet één enkele oplossing. Het was dat de vraag van het miljoen bestanden onderdeel werd van hoe we elke nieuwe functie beoordelen: wat gebeurt er met dit scherm, deze scan of deze cache als de bibliotheek tien keer groter is dan we verwachten?

Iemand zal elk getal dat we kiezen overschrijden, en deze keer zijn we liever voorbereid.

Heb je een enorme bibliotheek, dan is dit werk voor jou gedaan. Voelt SyncGallery ooit traag aan met jouw verzameling, laat het ons weten—echte bibliotheken leren ons meer dan synthetische benchmarks.

SyncGallery

Probeer SyncGallery

Een galerij-app voor Android met cloudsynchronisatie die jij beheert.

Download het via Google Play
Meer van de blogTerug naar boven