我正在使用 ByteBuffer.allocateDirect() 分配一些缓冲内存,用于将文件读入内存,然后最终散列该文件字节并从中获取文件散列 (SHA)。输入文件的大小范围很大,从几 KB 到几 GB 不等。
我已经阅读了几个关于选择缓冲区大小的线程和页面(甚至一些关于 SO)。有些人建议尝试选择一个本机文件系统使用的文件系统,以尽量减少对部分块等进行读取操作的机会。比如 4100 字节的缓冲区,NTFS 默认为 4096,所以额外的 4 位需要单独的读取操作,非常浪费。
所以坚持使用 2、1024、2048、4096、8192 等的幂。我见过一些推荐的 32KB 大小的缓冲区,还有一些建议将缓冲区设置为输入文件的大小(对于小文件可能没问题,但是什么关于大文件?)。
坚持原生块大小的缓冲区有多重要?现代而言(假设现代 SATA 驱动器或更好的驱动器缓存至少为 8Mb,以及其他现代操作系统“魔术”来优化 I/O)缓冲区大小有多重要,我应该如何最好地确定将我的大小设置为什么?我可以静态设置它,还是动态确定它?感谢您的任何见解。