gpt4 book ai didi

linux - 在 linux 中分配文件而不清零且不创建稀疏文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:03 25 4
gpt4 key购买 nike

我的目标是在不创建稀疏文件的情况下立即为文件分配大量空间。从文件中读取应该输出剩余空间中的垃圾,而不是 0。

truncatefallocate 都生成稀疏文件。

这可能吗?

最佳答案

我们可以避免零吗?

没有。这是不可能的。

出于明显的安全原因,内核将清除在删除、截断等操作时释放的扇区。因此,当您分配新文件时,它自动全为零。该清除可能是虚拟的(与在磁盘上物理写入零相反,尤其是因为它在 SSD 上不起作用——详情请参阅 shred(1))。

如果你想要非常快速的分配,唯一的方法是创建你自己的分区并自己管理它。如果您目前依赖 ext4 或其他类似文件系统的许多功能,这不是一件容易的事。

由于扇区应该已经设置为零,因此在磁盘上分配新(大)文件时应该不会对速度产生任何影响。

稀疏文件

根据经验,当您将零写入文件时,它物理上会将零写入磁盘。它根本不会创建稀疏文件。

在软件中,创建稀疏文件需要您使用 truncate()/ftruncate()放大文件的功能和lseek()在下一个 write() 之前超过文件末尾.但是,如果您执行全零的 write(),操作系统不会尝试将它们转换为稀疏文件。

换句话说,你可以用 C++ 写这样的东西,你不会得到一个稀疏文件:

int fd = open(filename, O_CREAT | O_WRONLY, 0600);
std::vector<uint8_t> buffer(size);
write(fd, buffer.data(), buffer.size());
close(fd);

此代码示例采用相对较小的 size 参数。否则使用循环会更有效率并且不太可能破坏你的内存。

在您的控制台中,这意味着使用一个工具将每个字节写入目标文件。对于非常大的文件(即写入 1Tb...你知道...),它会很慢:

head -c${SIZE} /dev/zero >"${OUTPUT}"

请注意,某些工具有意支持稀疏文件。例如:

  • cp 可用于复制稀疏文件。
  • dd 将完成在输入文件中查找零的工作,并适本地 truncate() 增加输出而不写入零。

当然有很好的理由在磁盘上分配物理文件,即使该操作很慢:

  • 您正在创建一个数据库文件;在这种情况下使用稀疏文件真的很危险(即写入可能会在错误的时间失败)并且分配新的 inode 是,因此您的数据库吞吐量可能会受到影响(虽然这只发生在写和增长你的数据库文件类似于在必要时为你的文件分配一个 inode )。
  • 您正在创建一个虚拟磁盘;我用稀疏文件测试了那些,它太糟糕了;至少在我带 HDD 的旧计算机上,运行 VPS 时速度太慢了
  • 您正在创建一个交换文件;使用稀疏文件进行交换真的不是一个好主意(这就像故意找麻烦!在分配新 block 的速度缓慢,文件可能会碎片化的事实,磁盘可能是在您需要交换空间时已满...)

关于linux - 在 linux 中分配文件而不清零且不创建稀疏文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51681906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com