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

标签 c++ io operating-system filesystems

我有一个加载文件和处理数据的应用程序。假设我有 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/

相关文章:

operating-system - "virtual memory"和 "swap space"之间有什么区别?

c++ - Win32 Api 将 2 字母(中性)标识符转换为语言

c++ - 在 C++ 中通过 CAN 发送部分数据

C++选择一些随机项目而不重复

c++ - std::initializer_list 值作为模板参数

scala - 如何在Scala中将字符串列表打印为标准错误?

Java线程输出

io - 驱动程序和用户应用程序之间的主要区别是什么?

python - 打开已经打开的文件不会引发异常

linux - 支持多核的最小 Linux 发行版?