1

如果我要读取一个大文件,多个线程同时运行会在没有缓冲区的情况下运行具有更快的传输速度,还是在操作系统缓冲区的情况下运行会更好?

4

2 回答 2

2

您不应该有多个线程同时读取同一个文件,用一个线程读取,然后以某种方式将数据发送给其他线程。也就是说,使用缓冲区读取会更快,但标准已经使用缓冲区(如果您使用 fread 或 ifstream 读取,如果您直接使用函数 read 将没有缓冲区)。

请注意,标准中的缓冲区将知道磁盘扇区大小,这意味着如果您直接使用读取,它将减少磁盘访问。

于 2011-04-14T04:36:07.740 回答
0

这在很大程度上取决于访问模式。考虑作为第一个示例的视频播放器,具有声音和视频线程。他们都需要在大致相同的位置顺序访问文件。然而,一旦它被读取,数据就不再需要了。因此,您需要一个可以提前读取但不保留旧数据的缓存。

作为第二个示例,考虑具有基于文件的表的数据库应用程序。多个线程可以执行独立的查询。不同的表和索引之间的引用位置不同。

显然,这些例子有很大的不同。对某些人来说,这表明应用程序应该管理缓存。并不真地; 最好的方法是告诉操作系统你要做什么。它在权衡取舍方面处于更好的位置。它可以查看到磁盘的所有流量,并计算出全局 RAM 压力。

出于这个原因,内存映射文件可以成为一种以随机访问方式读取具有多个线程的大文件的高性能方式。它为操作系统提供了平衡 I/O 和内存的好机会。

于 2011-04-14T09:00:34.163 回答