Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从不同的线程访问不同的文件,这是否有效?_C++_Io_Operating System_Filesystems - Fatal编程技术网

C++ 从不同的线程访问不同的文件,这是否有效?

C++ 从不同的线程访问不同的文件,这是否有效?,c++,io,operating-system,filesystems,C++,Io,Operating System,Filesystems,我有一个加载文件和处理数据的应用程序。假设我有10…20个文件要处理 为了让问题更清楚,有一些要求: 文件很小,可能最多只有几MB 可能有十几个文件,可能有一百个 一个例子可能是解析CSV数据或JSON,加载游戏3d模型 一个想法是并行使用一些线程池和进程文件。这有效吗?我的操作系统可以处理来自多个线程的文件访问吗 我发现这个问题: 但在我的应用程序中,一个线程将访问其“自己的”文件,因此不会发生任何冲突 在我的应用程序中,我使用的是C++/STL,但我想知道关于Linux和Windows

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

为了让问题更清楚,有一些要求:

  • 文件很小,可能最多只有几MB
  • 可能有十几个文件,可能有一百个
  • 一个例子可能是解析CSV数据或JSON,加载游戏3d模型
一个想法是并行使用一些线程池和进程文件。这有效吗?我的操作系统可以处理来自多个线程的文件访问吗

我发现这个问题:

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


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

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

在许多情况下,当您处理最近访问过的中等大小的文件(例如,每个文件不到十几兆字节,甚至可能每个文件不到半千兆字节)时,这些文件实际上都位于同一个位置。因此,您不会访问磁盘本身,并且您的程序实际上可以在RAM中工作(然后多线程应该是有效的)

顺便说一句,Linux具有提示内核虚拟内存子系统(即,提示页面缓存)的功能

如果您的常见用例是访问磁盘本身(例如,因为文件很大,或者因为您最近没有访问过它们,所以它们不在页面缓存中),那么多线程将没有帮助,因为瓶颈变成了硬件磁盘

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


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

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

在许多情况下,当您处理最近访问过的中等大小的文件(例如,每个文件不到十几兆字节,甚至可能每个文件不到半千兆字节)时,这些文件实际上都位于同一个位置。因此,您不会访问磁盘本身,并且您的程序实际上可以在RAM中工作(然后多线程应该是有效的)

顺便说一句,Linux具有提示内核虚拟内存子系统(即,提示页面缓存)的功能

如果您的常见用例是访问磁盘本身(例如,因为文件很大,或者因为您最近没有访问过它们,所以它们不在页面缓存中),那么多线程将没有帮助,因为瓶颈变成了硬件磁盘

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


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

根据我的经验,如果数据处理量很大,您可以获得更高的性能。在这种情况下,您将真正使程序的执行并行化。您还需要知道您的cpu有多少个核心。拥有比cpu核更多的线程是不值得的。
如果您的处理是“轻”的,那么您的线程可能总是在等待磁盘完成读取,而性能几乎没有提高

根据我的经验,如果数据处理繁重,您将获得更高的性能。在这种情况下,您将真正使程序的执行并行化。您还需要知道您的cpu有多少个核心。拥有比cpu核更多的线程是不值得的。
如果您的处理是“轻”的,那么您的线程可能总是在等待磁盘完成读取,而性能几乎没有提高

谢谢!我考虑的文件很小,可能只有几MB。另一个例子是并行编译:编译器可以这样做,并基本上为每个文件调用编译器。因此,应该有可能并行编译(例如,代码> > -j//> C++和GCC),涉及独立的进程(GCC本身不是多线程),并且大多数时候C++源文件都在页面缓存中(例如,因为您最近在编辑器中保存了它们),GCC也不会花费太多的时间在IO适当的地方。使用
g++-ftime报告运行它
谢谢!我考虑的文件很小,可能只有几MB。另一个例子是并行编译:编译器可以这样做,并基本上为每个文件调用编译器。因此,应该有可能并行编译(例如,代码> > -j//> C++和GCC),涉及独立的进程(GCC本身不是多线程),并且大多数时候C++源文件都在页面缓存中(例如,因为您最近在编辑器中保存了它们),GCC也不会花费太多的时间在IO适当的地方。使用
g++-ftime报告运行它
yes,因此线程池、系统线程池通常分配与核心计数匹配的工作线程(加上减去额外线程)。所以我有6个内核和100个文件,我仍然可以一次最多处理6个文件。不是100。是的,所以线程池、系统线程池通常分配与核心计数匹配的工作线程(加上减去额外线程)。所以我有6个内核和100个文件,我仍然可以一次最多处理6个文件。不是100。你确定在你的特殊情况下,装载需要很多时间吗?我猜它是如此之快以至于你的普通用户都没有注意到。我在这里问了一个有点一般性的问题,所以在我的简单应用程序中,文件访问速度很快(特别是当文件在系统缓存中时)。但我在想