【发布时间】:2014-01-07 07:48:15
【问题描述】:
我的应用程序使用文本文件将数据存储到文件中。 我正在测试通过多线程操作读取它的最快方法。 我使用了以下两种技术:
使用与 NUMBER_OF_PROCESSORS 环境变量一样多的流。每个流都在不同的线程上。为每个流平均划分文件中的总行数。解析文本。
只有一个流解析整个文件并将数据加载到内存中。创建线程 (= NUMBER_OF_PROCESSORS - 1) 以解析内存中的数据。
测试在 100kB - 800MB 的各种文件上运行。 文件中的数据:
100.23123 -42343.342555 ...(and so on)
4928340 -93240.2 349 ...
...
数据存储在double的二维数组中。
结果:两种方法解析文件的时间大致相同。
问题:我应该选择哪种方法?
方法 1 对硬盘不利,因为同时在随机位置执行多个读取访问。
方法 2 不好,因为所需的内存与文件大小成正比。这可以通过将容器限制为固定大小、删除解析的内容并从阅读器再次填充来部分克服。但这会增加处理时间。
【问题讨论】:
-
方法一中如何将文件拆分成多个流?毕竟线程必须从行首开始读取。
-
备选方案 3:Memory-mapped files.
-
@usr 通过寻找为每个流标记的特定位置。
-
IMO 没关系,除非您使用并行文件系统和硬件。瓶颈将始终位于 HDD 控制器上。您只能尝试保持顺序读取顺序。
-
如果性能是一个如此关键的问题,你能把你的文件变成二进制文件吗?这将大大减少文件的大小和读取文件所需的 IO。
标签: c++ multithreading file