问题描述
我需要从磁盘传输大文件。假设文件大于内存容量。此外,假设我正在对数据进行一些计算,并且结果足够小以适合内存。作为一个假设的例子,假设我需要计算 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/