Distinguerei due principali categorie di procedure / approcci:
- Una procedura carica alcuni dati nella memoria principale, esegue alcune operazioni e salva il risultato sul disco.
- Una procedura viene eseguita come un filtro che legge un flusso di dati e produce un nuovo flusso di dati come output, che viene salvato al volo. Quando viene raggiunta la fine del flusso di input, la procedura termina.
Nel primo caso (es. lettura, modifica, salvataggio di un documento), l'utilizzo della memoria può essere lineare (o anche quadratico o più) nella dimensione dei dati di input: la dimensione maggiore per i dati di input sarà determinata dal quantità di memoria disponibile. Puoi utilizzare questo approccio quando i tuoi dati di input sono abbastanza piccoli rispetto alla memoria disponibile.
Nel caso dei secondi (ad esempio filtrando le informazioni rilevanti da un grande file di log) anche un utilizzo lineare della memoria può essere indesiderabile, dal momento che è facile esaurire la memoria non appena il flusso di input è abbastanza grande. Per problemi di categoria 2 accetterei solo una soluzione che può essere eseguita in memoria costante (stack e heap).
Se la tua soluzione rientra nella categoria 1 o 2 può dipendere dalla dimensione (prevista) dei dati. Prendi ad esempio l'ordinamento. Se è necessario ordinare 100 MB di stringhe, è sufficiente caricare i dati nella memoria principale e utilizzare un algoritmo in memoria. D'altra parte, se hai bisogno di ordinare 1 TB di dati, dovresti prendere in considerazione un algoritmo che utilizza la memoria principale costante (come alcune implementazioni di merge sort).