代码之家  ›  专栏  ›  技术社区  ›  user3732361

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

  •  5
  • user3732361  · 技术社区  · 6 年前

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

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

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

    我能想到的另一个原因是,块大小是指硬盘上的一组扇区(请纠正我)。所以它可能指向8、16、32或一个扇区。因此,如果块指向更多扇区,那么您的硬盘就必须做更多的工作?我说得对吗?

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

    提前非常感谢您的回答。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Abhishek Keshri    6 年前

    理论上,当缓冲区 页面对齐,并且当其大小是系统块的倍数时 大小

    如果文件连续存储在硬盘上,则最快的I/O 通过逐缸读取数据可以获得吞吐量。(在那里 甚至不会有任何延迟,因为当你读一整首歌的时候 你不需要从头开始,你可以从中间开始, 和循环)。不幸的是,现在几乎不可能 这样做,因为硬盘固件隐藏了 扇区,并可能使用需要甚至查找的替换扇区 阅读一首单曲。OS文件系统还可能尝试传播 整个磁盘上的文件块(或至少整个圆柱体上的文件块 组),以避免在 正在访问小文件。

    因此,与其考虑物理轨迹,不如考虑 计算硬盘缓冲区大小。大多数硬盘的缓冲区大小为 8 MB,大约16 MB。因此,按最大为1 MB或2 MB的块读取文件 应该让硬盘固件优化吞吐量,而无需 暂停缓冲区。

    但是,如果上面有很多层,例如RAID,那么所有赌注都是 关

    真的,你能做的最好的事情就是对你的 情况。