Probabilmente non è possibile memorizzare l'intero insieme di numeri interi in memoria. Ad esempio, un tipo Uint in C # richiede 4 byte di memoria e ne hai circa 4,2 miliardi, quindi avrai bisogno di 17.179.869.180 byte di memoria o di 17.1 gig di memoria solo per memorizzare tutti i numeri. Se possibile, inizializzare una lista ordinata con tutte le possibilità e quindi elaborare il file rimuovendo le voci dalla lista così come sono state trovate. Alla fine, se tutti i numeri sono presenti, l'elenco risultante conterrà zero voci.
Un altro approccio dovrebbe utilizzare una sorta di memoria persistente come un database. Carica tutti i 4,2 miliardi di record (numeri) nella tabella. Una riga per ogni numero. La chiave primaria è il numero.
Quindi avviare l'elaborazione del file utilizzando gli aggiornamenti batch per eliminare i record dei numeri nel file. Ci sarebbe voluto un po ', ma alla fine tutti i miliardi di record nel file sarebbero stati elaborati.
In questo caso, per elaborare l'intero file ci vuole pochissima memoria perché l'elenco è persistente. Il database potrebbe nasconderlo comunque, ma da un punto di programma molto useremmo con pochissime risorse.
Se parliamo di long, i requisiti sono ancora più grandi poiché i valori superiori per long (Int64) sono 9.223.372.036.854.775,807. Questa è una quantità enorme di dati da elaborare e mantenere. La memoria non sarebbe un'opzione e persino l'uso dell'archiviazione persistente non sarebbe fattibile a causa della quantità di possibilità.
È possibile suddividere l'intero elenco di numeri in partizioni e potenzialmente elaborare l'intero set su una farm di server che ogni server tiene traccia di un intervallo di numeri trovati. Potrebbe essere possibile se non avessi limiti di risorse.