You should perhaps be using memory-mapped files [1]. This allows opening up a file and reading from it chunk by chunk. It's implemented by the MemoryMappedFile [2] class.
[1] https://learn.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files [2] https://learn.microsoft.com/en-us/dotnet/api/system.io.memorymappedfiles.memorymappedfile