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

how to choose chunk size when reading a large file?

我知道读取块大小是文件系统块大小的倍数的文件会更好。

1) 为什么会这样?我的意思是说块大小是 8kb,我读到 9kb。这意味着它必须去获取 12kb,然后摆脱其他额外的 3kb。 是的,它确实做了一些额外的工作,但是除非你的块大小真的很大,否则这会有很大的不同吗?

我的意思是是的,如果我正在阅读 1tb 的文件,那么这肯定会有所不同。

我能想到的另一个原因是块大小是指硬盘上的一组扇区(请指正)。所以它可能指向 8 或 16 或 32 或只是一个扇区。所以如果块指向更多的扇区,你的硬盘将不得不做更多的工作?我说得对吗?

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

非常感谢您的所有回答。

理论上,最快 I/O 可能发生在缓冲区为 页对齐,并且当它的大小是系统块的倍数时 尺寸。

如果文件连续存储在硬盘上,最快I/O 吞吐量将通过逐个柱面读取来实现。 (那里 那时甚至可能没有任何延迟,因为当您阅读整首曲目时 你不需要从头开始,你可以从中间开始, 并循环)。不幸的是,现在几乎不可能 这样做,因为硬盘固件隐藏了硬盘的物理布局 扇区,并且可以使用需要甚至寻找的替换扇区 阅读单曲。 OS 文件系统也可能尝试传播 整个磁盘上的文件块(或者至少,整个柱面上 组),以避免在大文件上进行长时间搜索 正在访问小文件。

因此,与其考虑物理轨道,不如尝试考虑 考虑硬盘缓冲区大小。大多数硬盘的缓冲区大小为 8 MB,大约 16 MB。因此,按最大 1 MB 或 2 MB 的块读取文件 应该让硬盘固件优化吞吐量而不 拖延它的缓冲区。

但是,如果上面有很多层,例如 RAID,所有的赌注都是 关闭。

真的,你能做的最好的事情就是对你的特定对象进行基准测试 情况。