L'approccio accademico sarebbe quello di avere un livello discreto, il più breve possibile, ma completo tra l'applicazione e il mezzo di persistenza (che si tratti di file system, database o una combinazione di questi) che conta le dimensioni di tutto ciò che viene aggiunto, modificato o rimosso dalla persistenza e continua ad aggiornare il totale nel profilo.
Tuttavia, ad un certo punto nel tempo ti imbatterai inevitabilmente nel problema di dover ricalcolare tutto, quindi dato che molto probabilmente dovrai scrivere il codice ricalcolato-tutto, potresti desiderare (almeno all'inizio) di riutilizzarlo quel codice e salta la soluzione accademica. Quindi, ogni volta che viene effettuato un inserimento, aggiornamento o rimozione, si imposta un flag "dirty" nel profilo, e quindi si ha un processo batch separato che cerca i profili "sporchi" e ricalcola la quantità di spazio occupato, interrogando il filesystem, database, ecc.
Ovviamente, questo significa che le modifiche alle quote non saranno visibili immediatamente e, soprattutto, una volta che avrai abbastanza clienti questo approccio sarà troppo costoso per essere fattibile, ma una volta che avrai abbastanza clienti, presumibilmente sarai abbastanza ricco per essere in grado di permettersi una riscrittura completa.
Oppure, vai con la soluzione accademica.