从单独的线程访问单独的文件,这是否有效?

Accessing separate files from separate threads, is this efficient?

我有一个加载文件和处理数据的应用程序。假设我有 10...20 个文件要处理。

一些要求,使问题更清楚:

一个想法是并行使用一些线程池和进程文件。这有效率吗?我的操作系统可以处理来自多个线程的文件访问吗?

我发现了这个问题: Accessing a single file with multiple threads

但在我的应用程序中,一个线程会访问其 "own" 文件,因此不会发生任何冲突。

在我的应用程序中,我使用的是 C++/STL,但我想知道 Linux 和 Windows 上关于文件系统的一般观点。

您需要进行基准测试。(在您的情况下可能值得使用多个线程;但是在您的情况下,加载应该非常快,甚至是按顺序完成,你的普通用户不会注意到)

在许多情况下,当您处理最近访问过的中等大小的文件(例如,每个文件不到十几兆字节,或者甚至每个文件可能有 0.5 GB)时,这些文件实际上位于 page cache.所以你不会访问磁盘本身,你的程序实际上在 RAM 中运行(然后多线程应该有效)。

顺便说一句,Linux 有 readahead(2), posix_fadvise(2), madvise(2) 提示内核虚拟内存子系统(即给页面缓存提示)。

如果您的常见用例是访问磁盘本身(例如,因为文件很大,或者因为您最近没有访问过它们,所以它们 在page cache),那么多线程就无济于事了,因为瓶颈就变成了硬盘。

请记住,磁盘(即使是 SSD 磁盘)比 RAM 慢数千倍,并且它按顺序执行 IO 操作。

此外,您可能会在 parsing 文件中花费一些 CPU 时间。如果这需要大量 CPU,那么在多个独立线程中 运行 是值得的。

根据我的经验,如果数据处理量很大,您可以获得更高的性能。在这种情况下,您实际上可以并行执行程序。您还需要知道您的 cpu 有多少核心。拥有比 cpu 核心更多的线程是不值得的。 如果您的处理是 "light",则您的线程可能总是在等待磁盘完成读取,而性能几乎没有任何提升。