E' un po' bischero aprire un file, portarlo TUTTO in memoria per cercare delle stringhe.
Non ti serve portarlo TUTTO in memoria: questo e' il caso PEGGIORE di implementazione.
L'altro caso peggiori si trova dalla parte opposta dell'approccio: leggere un byte alla volta.
La via di mezzo, leggi blocchi che ne so, da 1MB, oppure 64KB alla volta ed analizzi SOLO quelli (in modo 'intelligente' per gestire i casi in cui una stringa si trova a cavallo tra due blocchi adiacenti).
In questo modo puoi PROCESSARE non solo GIGABYTE, ma anche TERA/PETA/EXABYTE :-)