如何并行化文件读写

时间:2010-01-03 02:09:45

标签: multithreading file

我有一个程序从2个文本文件中读取数据,然后将结果保存到另一个文件中。由于要读取和写入的数据很多会导致性能下降,因此我希望将读写操作平行化。

我最初的想法是,使用2个线程作为示例,一个线程从头开始读/写,另一个线程从文件中间读/写。由于我的文件被格式化为行,而不是字节(每行可能具有不同的数据字节),因此逐字节搜索对我来说不起作用。我能想到的解决方案是先使用getline()跳过前面的行,这可能效率不高。

有没有好的方法来寻找文件中的指定行?或者您是否有任何其他想法来平均文件阅读和写作?

环境:Win32,C ++,NTFS,单硬盘

感谢。

-Dbger

3 个答案:

答案 0 :(得分:20)

一般来说,您不希望并行化磁盘I / O.硬盘不喜欢随机I / O,因为它们必须不断寻找数据。假设您没有使用RAID,并且您使用的是硬盘而不是某些固态内存,那么如果您并行化I / O,您将看到严重的性能下降(即使使用这些技术,您仍然可以看到一些性能在进行大量随机I / O时会出现降级。

要回答你的第二个问题,确实找不到文件中某一行的好方法;您只能使用read函数明确寻找字节偏移量(有关如何使用它的更多详细信息,请参阅this page

答案 1 :(得分:3)

当您针对一个磁盘运行时,排队多次读取和写入将无济于事。如果您的应用程序还在CPU中执行了大量工作,那么您可以异步执行读写操作,并让CPU在后台发生磁盘I / O时工作。或者,获取第二个物理硬盘驱动器:从一个读取,写入另一个。对于适度大小的数据集,这些数据集通常比编写代码更有效且更便宜。

答案 2 :(得分:1)

这不是你问题的真正答案,而是重新设计(我们都讨厌但无法帮助)。如前所述,尝试加速具有多个线程的硬盘上的I / O可能无济于事。

然而,根据数据敏感性,吞吐量需求,数据大小等,可能会使用另一种方法。在内存中创建一个维护数据图像并允许轻松/快速更新的结构并不困难数据中任何位置的文本行。然后,您可以使用专用线程来监视该结构,并将其数据写入磁盘。将数据顺序写入磁盘可能非常快;它可以比随机搜索不同的部分并将其分成几部分快得多。