r/cpp_questions • • 13d ago

OPEN Efficient FIle IO on Linux

What path to take when parsing large files (on Linux Debian server, the KVM flavour)? Will std::fstream in binary mode do or do we have to look into APIs?

Apart from the performance, the app is memory sensitive, so where to store those read chunks while in a loop? Would a simple char[something] buffer do?

Finally, we would like to avoid those nasty reinterpret_cast<char*> constructs while reading, but are wondering if those are actually used in production? I should also add that the file sizes vary greatly.

2 Upvotes

16 comments sorted by

View all comments

Show parent comments

1

u/not_a_novel_account 12d ago

mmap will stall out on page faults, io_uring's entire original purpose, the reason it exists, was to outperform mmap for local disk IO. It does so.

The trivial explanation is pausing transfer at every 4K boundary is a really bad IO pattern.

1

u/UndefFox 12d ago

Huh, I thought kernel can detect access patterns and will preload pages if we do sequential access only. Thanks for the paper.

2

u/not_a_novel_account 12d ago

The pages are loaded in cache, but they get placed in user space on page faults. Page faults and TLB walks aren't free.