从单独的线程访问单独的文件,这样有效吗?

时间:2019-01-04 07:15:32

标签: c++ io operating-system filesystems

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

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

  • 文件很小,最大可能只有几个MB
  • 可能有十几个文件,也许有一百个
  • 一个示例可能是解析CSV数据或JSON,加载游戏3d模型

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

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

但是在我的应用程序中,一个线程将访问其“自己的”文件,因此不会发生任何冲突。

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

2 个答案:

答案 0 :(得分:1)

您需要进行基准测试。(在您的情况下,可能值得使用多个线程;但是,在您的情况下,加载速度应如此之快,甚至需要按顺序进行,以使普通用户赢得没有通知)

在许多情况下,当您处理最近访问过的中等大小的文件(例如每个文件小于12兆字节,或者每个文件甚至半个千兆字节)时,这些文件实际上位于page cache中。因此,您将不会访问磁盘本身,并且程序实际上可以在RAM中运行(然后多线程应该有效)。

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

如果您的常见用例是访问磁盘本身(例如,由于文件很大,或者因为您之前从未访问过它们,因此它们在页面缓存中不是 ),则多线程将无济于事,因为瓶颈已成为硬件磁盘。

请记住,磁盘(甚至是SSD磁盘)要比RAM慢数千倍,并且它会顺序执行IO操作。

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

答案 1 :(得分:1)

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