【问题标题】:Fastest way of reading a file in Linux?在 Linux 中读取文件的最快方法是什么?
【发布时间】:2013-10-24 12:42:20
【问题描述】:

在 Linux 上,将文件读入字节数组/处理字节的最快方法是什么?这可能包括内存映射、系统调用等。我不熟悉许多 Linux 特定的功能。

过去我使用过提升内存映射,但我需要更快的 Linux 特定性能而不是可移植性。

【问题讨论】:

  • boost::iostreams 在 linux 上使用 mmap,直接使用可能会发现细微差别。
  • 也许您需要 readv(),这将允许您将数据收集到数组字节中。详情请见man readv()

标签: c++ c linux linux-kernel memory-mapped-files


【解决方案1】:

不要让自己被内存映射等懒惰的东西所迷惑。而是专注于你真正需要的东西。您真的需要将整个文件读入内存吗?然后打开、循环读取块和关闭文件的直接方式将尽可能快。

但通常你并不真正想要那样。相反,您可能想要读取特定部分,此处的块,那里的块,跳转文件,读取特定位置的块等。

那么仍然fseeking 那些位置和freading 块不会有值得一提的开销。但是使用内存映射让操作系统或库处理诸如内存分配之类的事情会更方便。但它不会更快地完成工作。

【讨论】:

  • mmap 在足够大的文件上应该更快,因为您可以避免将内容从页面缓存复制到用户空间。这根本不是“懒惰的东西”。随机访问应该没有区别,因为mmap 实际上并没有从文件系统中读取比任何随机搜索/读取更多的数据。 mmap 的唯一缺点可能是创建映射的开销,但这不应该高于 malloc 将导致的开销。特别是当您多次调用 malloc 时。
  • 嗯,内存映射可以当然可以懒惰地实现(取决于操作系统),而将文件内容读入内存块则不能(或者至少那会是更复杂,因此不太可能)。我回答的主要方面是指出将整个文件放入内存可能没有意义,应该重新考虑。
  • 关于避免将内容从页面缓存复制到用户空间的上述优势:缓存是我没有解决的完全不同的方面。它仅适用于用户多次读取文件的情况;我将这个问题解释为它询问如何尽可能快地实际读取文件(并实际读取)。
  • 没有。避免从页面缓存中复制不是多次读取/缓存的问题。除非您执行一些非常具体的操作,否则操作系统将始终将文件从磁盘(或网络)读取到页面缓存中(仅当您确切知道自己在做什么以及为什么这样做时才建议这样做)。因此,以除了 mmap 之外的任何其他方式读取文件的内容都将执行内存到内存的复制(除非操作系统具有零复制机制,但这些机制非常昂贵并且等同于 mmap,除了速度较慢并且仅在所有星星排列得恰到好处)。
  • @Art:你量过吗?一位朋友试图优化 ****,从读取整数文件(表示整数的文本,~100Mb)分成几行,最快的是读取块,处理每个完整的行,将未处理的内容移动到开头块并在此之后读取另一个块......我建议测试不同的替代方案
【解决方案2】:

mmap 如果文件足够大,应该是访问文件内容的最快方式。设置内存映射有一个初始成本,但由于不需要将数据从页面缓存复制到用户空间而抵消了这一成本。如果你想要文件的所有内容,分配内存给你的程序的成本应该和mmap的成本差不多。

一如既往,您最好的选择是进行测试和基准测试。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多