当读取大文件时如何选择块大小?

5

我知道使用块大小的倍数来读取文件更好。

1) 为什么呢?比如说块大小是8kb,我读取了9kb。这意味着它必须读取12kb,然后去掉其他多余的3kb。是的,它确实做了一些额外的工作,但除非你的块大小真的很大,否则这会产生多大的差异呢?

我的意思是,除非我正在读取1tb的文件,否则这肯定有所不同。

我能想到的另一个原因是块大小指的是硬盘上一组扇区(请纠正我)。因此,如果块指向更多的扇区,您的硬盘本质上需要做更多的工作,对吗?

2) 那么,假设块大小为8kb。我现在应该每次读取16kb?1mb?1gb?我应该使用什么作为块大小?我知道可用内存是一个限制,但除此之外,还有哪些因素影响我的选择?

感谢您提前回答所有问题。

1个回答

6
从理论上讲,当缓冲区与页面对齐并且其大小是系统块大小的倍数时,最快的I/O可以发生。
如果文件在硬盘上连续存储,则通过逐个读取磁道可以达到最快的I/O吞吐量。(甚至不会有任何延迟,因为当您读取整个磁道时,您不需要从头开始,可以从中间开始循环)。不幸的是,由于硬盘固件隐藏扇区的物理布局,并且可能使用替换扇区,在读取单个磁道时需要进行寻道,因此现在几乎不可能这样做。操作系统文件系统也可能尝试将文件块分散在整个磁盘上(或者至少分散在一个柱面组中),以避免在访问小文件时执行长时间的大文件寻道。
因此,您可以尝试考虑硬盘缓冲区大小,大多数硬盘具有8 MB的缓冲区大小,一些硬盘具有16 MB的缓冲区大小。因此,按1 MB或2 MB的块读取文件应该能让硬盘固件优化吞吐量而不会使其缓冲区停顿。
但是,如果存在许多层以上,例如RAID,则所有赌注都无效。
真正最好的方法是对您特定的情况进行基准测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接