2013-08-07 49 views
11

典型的文件系统和POSIX接口只允许在最后调整文件大小。通常,关闭后文件在磁盘上的大小等于读/写位置关闭时的偏移量。关闭之前寻找也称为“重新定位文件结束”。什么文件系统允许重定位文件的开头?

包含数据队列的文件将通过删除文件开头的操作更有效地表示。开始时的磁盘分配块可以被释放,并且不必要的拷贝被最小化。

这是否直接受到任何常见文件系统格式和/或操作系统的支持?什么样的界面被用来做到这一点? (例如,一个Linux fcntl选择器。)我很确定我在实践中听说过这种事情。

+2

关闭,选民...问一个Linux API基本上使这是一个“关于编程的问题。”如果你对不能回答感到不适,可以去其他地方消磨时间。 – Potatoswatter

回答

1

实际上,Linux 确实有有一个接口,可以做你正在请求的东西。这是FALLOC_FL_COLLAPSE_RANGE标志将会崩溃。它由现代内核上的btrfs,ext4和xfs(可能还有其他)支持。尽管fallocate接口允许您指定字节偏移量和长度,但实际上COLLAPSE_RANGE调用仅在偏移量和长度是文件系统块大小的倍数时才起作用。

欲了解更多信息,请参见精细手册的fallocate(2)系统调用:http://man7.org/linux/man-pages/man2/fallocate.2.html

+0

谢谢!旧的'FALLOC_FL_PUNCH_HOLE'标志也解决了实际问题,尽管不会改变偏移量。我没有尝试过,但是联机帮助页表明它可靠地与字节一起工作。 – Potatoswatter

+0

它通过将它们置零来处理字节。如果您试图释放空间回到文件系统,它只会在对齐的4k块中执行此操作。 –

1

我见过的最接近的是文件格式,表明数据已被“删除”,然后被删除的空间可以重复使用。这通常只适用于DBF等固定长度的记录格式,并且需要更多内存才能保留已重新删除的记录索引以及文件内记录的顺序。

+0

如果删除的块可以完全清零,这与OP提出的方案一样有效,因为Unix FS倾向于使用稀疏表示,其中不存储零块。 –

+1

@larsmans:不幸的是,将非稀疏文件转换为稀疏文件并不便宜,即使所讨论的字节已被清零。 –

4

不可以,不管在Unix世界里,无论如何。

如果您查看DBMS或Unix(ish)文件系统内部结构,它们可以在开始,结束或中间的任何位置轻松截断或扩展数据集。但他们不会导出该功能;它不是Unix API传统或POSIX标准的一部分,所以任何“开始时截断”或“开始时扩展”的API都将是非标准(“专有”)。

这些函数的边际效用也不清楚。谁会使用它们?多久?对于应用程序代码来说,Unix文件(扁平的字节/字符序列)已经被证明是简单而有效的,但是对于分层数据结构而言,它却是一个糟糕的基础。二十五年前,该声明值得商榷;今天它只是一个观察到的历史现实。

Unix开发人员过去常常说“所有的东西都可以归为文件”,“我们可以通过聪明的寻求获得随机访问”。然而,这些说法从未完全奏效。例如,Unix从不与小型机和大型机操作系统(例如DEC RMS,IBM ISAM和VSAM)的随机访问记录管理能力相匹配。尽管那些实现文件系统,队列,尝试,关系数据库和对象存储的应用程序偶尔会将内容放入文件中,并且它们将文件用于日志等顺序操作,但它们很少依赖字符流作为它们的低级格式。相反,他们使用B树和散列表等结构来直接管理磁盘块,内存段和其他底层资源。

字符流属于表格,文档和对象 - 适用于客户端应用程序的抽象。如果你想要一个队列,可以考虑使用现有的中间件(例如RabbitMQ,ZeroMQ,REDIS,某些DBMS管理器)。如果你必须自己构建它,你可能不会在简单的字符流抽象上构建它。因此,尽管截断/扩展在开始时对于某些事情(对数修剪而不是分段对数旋转,例如)可能是有用的,但对于大多数数据结构实现来说,这不太可能是大赢家。

1

重新定位文件的开头可能不是一个好主意。这可能会混淆具有在该文件上打开的文件描述符并期望它正确可查找的进程,即具有可预测的偏移。

如果您的主要目标只是为了节省磁盘空间,有几种方法。

如果您有ZFS支持并启用重复数据删除,则可以通过用零覆盖之前释放之前用于存储文件开头(或实际任何部分)数据的块。

在Linux下,您还应该能够通过使用fallocate系统调用并将FALLOC_FL_PUNCH_HOLE标志传递给支持稀疏文件(大多数)的文件系统来释放文件存储的部分内容。 Solaris提供了类似的fcntl命令F_FREESP。虽然fallocatefcntl将有效地工作或根本不依赖于实施。

或者,如果你运行一个操作系统,不提供fallocate或等效的功能,但支持ZFS(如:FreeBSD),和/或如果重复数据删除是不是一种选择,因为你没有足够的内存来奉献给它,一个轻量级的替代方案就是在文件系统上启用压缩。

相关问题