0

我正在开发 Java 上的跨平台非分布式磁盘存储协议。文件将由相当独立的、通常很小 (< 4 KB) 的“数据块”组成。是否可以避免跨 FS 块边界写入块使协议更加健壮,因为 FS 块读取失败将触及更少的块?我可以假设在大多数文件系统中,文件数据的开头是块对齐的吗?

假设我知道,目标分区上的块大小为 4 KB。

SeekableByteChannel ch = Files.newByteChannel(file, CREATE, WRITE);
ch.write(buffer);
long pos = ch.position();
long alignment = 4096;
if (pos % alignment != 0)
    ch.position(((pos / alignment) + 1) * alignment);
ch.write(buffer2); // will buffer2 data be really FS block-aligned?
4

1 回答 1

1

是否可以避免跨 FS 块边界写入块使协议更加健壮,因为 FS 块读取失败将触及更少的块?

理论上是的,但在实践中,我怀疑它会有所作为。首先,光盘错误非常罕见……尽管您有经验。

在 4k 边界上对齐“块”的缺点是您可能会浪费大量磁盘空间,尤其是在您的文件通常很小的情况下。(具有讽刺意味的是,这种浪费意味着您使用了更多的磁盘块......这增加了您对磁盘错误的脆弱性。)

我可以假设在大多数文件系统中,文件数据的开头是块对齐的吗?

在大多数文件系统中,是的。总之,没有。


如果您担心光盘错误,我建议您执行以下一项或多项操作:

  • 在允许您从丢失整张磁盘中恢复的配置中使用 RAID 磁盘阵列。

  • 定期备份,最好在异地保留一份副本。

  • 在光盘超出保修期之前更换它们......或者如果有迹象表明您的光盘来自“坏批次”。

于 2013-05-26T15:56:08.653 回答