我有一个加载文件和处理数据的应用程序。假设我有 10...20 个文件要处理。
一些要求,使问题更清楚:
- 文件很小,最多只有几 MB
- 可能有十几个文件,也许有一百个
- 一个例子可能是解析 CSV 数据或 JSON,加载游戏 3d 模型
一个想法是并行使用一些线程池和进程文件。这有效率吗?我的操作系统可以处理来自多个线程的文件访问吗?
我发现了这个问题: Accessing a single file with multiple threads
但在我的应用程序中,一个线程会访问其“自己的”文件,因此不会发生任何冲突。
在我的应用程序中,我使用的是 C++/STL,但我想知道关于 Linux 和 Windows 上的文件系统的一般观点。
最佳答案
您需要进行基准测试。(在您的情况下可能值得使用多个线程;但是在您的情况下,加载应该非常快,甚至是按顺序完成,以至于您的普通用户赢得了注意)
在许多情况下,当您处理最近访问过的中等大小的文件(例如,每个文件不到十几兆字节,或者甚至可能是半千兆字节)时,这些文件实际上位于 page cache 中。 .所以你不会访问磁盘本身,你的程序实际上在 RAM 中运行(然后多线程应该有效)。
顺便说一句,Linux 有 readahead(2) , posix_fadvise(2) , madvise(2)提示内核虚拟内存子系统(即提示页面缓存)。
如果您的常见用例是访问磁盘本身(例如,因为文件很大,或者因为您最近没有访问过它们,所以它们不在页面缓存中),那么多线程无济于事,因为瓶颈变成了硬件磁盘。
请记住,磁盘(即使是 SSD 磁盘)比 RAM 慢数千倍,并且它按顺序执行 IO 操作。
此外,您可能会在 parsing 中花费一些 CPU 时间。文件。如果这需要大量 CPU,则值得在多个独立线程中运行。
关于c++ - 从单独的线程访问单独的文件,这是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54034552/