If performance matters that much (which is really unlikely) you could avoid the small overhead of C++ streams and directly use Linux or Posix specific syscalls to read a file (plain file in a file system, i.e. not a pipe) like mmap(2) or read(2), madvise(2), and even (in some other thread) readahead(2). See also this answer.
If using read
(e.g. because reading some pipe(7), not a disk file) you probably want to use quite big blocks or buffers, e.g. reading at least 64 kilobytes at once.
However, the hardware (disk probably) is probably the bottleneck. Consider buying more RAM (to increase filesystem cache) and some SSD. See also linuxatemyram ...
You may want to use several (e.g. 2 to 6) threads (with pthreads) and/or asynchronous I/O; see aio(7). I don't think it is worth the effort. Avoid race conditions thru synchronization.
Study also the architecture and implementation of high-performance SMTP free software mail transfer agents (MTA) like exim or postfix... They are dealing quite well with an issue similar to yours.
You will need to benchmark your application to tune parameters.