performance - 在空间使用量恒定的情况下从磁盘流式传输数据的最有效的习惯用法是什么?

标签 performance streaming posix large-files mmap

问题描述

我需要从磁盘传输大文件。假设文件大于内存容量。此外,假设我正在对数据进行一些计算,并且结果足够小以适合内存。作为一个假设的例子,假设我需要计算 200GB 文件的 md5sum,并且需要保证将使用多少内存。

总结:

  • 需要保持恒定的空间
  • 尽可能快
  • 假设文件非常大
  • 结果适合内存

问题

使用恒定空间从文件读取/流式传输数据的最快方法是什么?

我的想法

如果文件足够小以适合内存,那么 POSIX 系统上的 mmap 将会非常快,不幸的是,这里的情况并非如此。使用具有较小缓冲区大小的 mmap 来缓冲文件的连续 block 是否有任何性能优势?将 mmap 缓冲区移动到文件中的系统调用开销是否会占据优势?或者我应该使用通过 fread 读入的固定缓冲区吗?

最佳答案

我不太确定 mmap 会非常快(其中“非常快”被定义为比 fread 快得多)。

Grep 过去使用 mmap,但后来改回 fread。原因之一是稳定性(如果文件在映射时缩小或发生 IO 错误,则 mmap 会发生奇怪的事情)。这个page讨论了一些相关的历史。

您可以使用 grep 的 --mmap 选项来比较系统上的性能。在我的系统上,200GB 文件的性能差异可以忽略不计,但您的情况可能会有所不同!

简而言之,我将使用 fread 和固定大小的缓冲区。它的编码更简单,更容易处理错误,而且几乎肯定会足够快。

关于performance - 在空间使用量恒定的情况下从磁盘流式传输数据的最有效的习惯用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1863703/

相关文章:

performance - Rust - 为什么我的程序执行速度非常慢 - 比使用 Node 用 Ja​​vaScript 编写的相同程序慢 5 倍以上

WPF:提高在较旧的PC上运行的性能

php - 计算响应的文件大小?

在 close(2) 之后调用 fsync(2)

`posix_spawn` 的能力

linux - 在 Linux 上设置 tmpfile() 的目录

java - TCPTransportConnection 内存泄漏

java - 如何在java中获得良好的正则表达式性能

ffmpeg - Wowza 错误 :Failed to play myStream; stream not found.

ffmpeg - 使用 FFMPEG 将连续视频文件流式传输到 RTMP 服务器