gpt4 book ai didi

c++ - 从 C++ 中的文件中读取多线程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:43 25 4
gpt4 key购买 nike

我的应用程序使用文本文件将数据存储到文件中。我正在测试通过多线程操作来读取它的最快方法。我使用了以下两种技术:

  1. 使用与 NUMBER_OF_PROCESSORS 环境变量一样多的流。每个流都在不同的线程上。将文件中的总行数平均分配给每个流。解析文本。

  2. 只有一个流解析整个文件并将数据加载到内存中。创建线程(= NUM​​BER_OF_PROCESSORS - 1)以解析内存中的数据。

测试是在 100kB - 800MB 的各种文件大小上运行的。文件中的数据:

100.23123 -42343.342555 ...(and so on)
4928340 -93240.2 349 ...
...

数据存储在 double 的二维数组中。

结果:两种方法解析文件的时间大致相同。

问题:我应该选择哪种方法?

方法 1 对硬盘不利,因为同时在随机位置执行多个读取访问。

方法 2 不好,因为所需的内存与文件大小成正比。这可以通过将容器限制为固定大小、删除已解析的内容并从阅读器重新填充来部分克服。但这会增加处理时间。

最佳答案

方法 2 存在顺序瓶颈(单线程读取和分发工作项)。根据阿姆达尔定律,这不会无限扩展。不过,这是一种非常公平和可靠的方法。

方法 1 没有瓶颈,可以扩展。一定不要造成磁盘随机IO。我会使用互斥体一次只读取一个线程。读取大约 4-16MB 的大连续 block 。在磁盘执行单个磁头寻道时,它可能已经读取了大约 1MB 的数据。

如果解析行需要花费大量时间,则不能使用方法 2,因为顺序部分很大。它不会扩展。但是,如果解析速度很快,请使用方法 2,因为它更容易正确。

为了说明瓶颈的概念:想象一下 1.000.000 个计算线程要求一个读取线程给它们行。一个读者线程将无法跟上他们要求的速度。您不会获得 1e6 倍的吞吐量。这不会扩展。但是如果 1e6 个线程独立地从一个非常快的 IO 设备读取,你会得到 1e6 倍的吞吐量,因为没有瓶颈。 (我使用极端数字来说明这一点。同样的想法也适用于小数点。)

关于c++ - 从 C++ 中的文件中读取多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com