文件映射导致的文件碎片

时间:2013-10-19 18:25:37

标签: mmap

我有一个程序(用c编写)同时创建200多个文件,并使用mmap将它们映射到程序地址空间,同时写入它们。一切正常,但是当我来备份目录时,由同一个程序创建和写入的文件从同一个磁盘复制比在映射和写入几个字节的磁盘快得多(5-10倍)。一时间我只能想象这是由于某种文件碎片造成的,尽管我认为这甚至不适用于ufs文件系统。

有没有人对此有任何想法:

1)尝试解决此问题是一个好主意,在正常使用情况下,文件可能会按照它们写入的顺序回读吗?

2)如果有一个很好的解决方案,该怎么办呢?

磁盘的文件系统是ufs

1 个答案:

答案 0 :(得分:0)

最终我在Free BSD手册页中找到了

"警告!因此,使用ftruncate(2)扩展文件             创建一个大洞,然后通过修改共享mmap()填充漏洞可能导致严重的文件碎片 -             心理状态。为了避免这种分裂你             应始终预先分配文件的后备存储             先将零()写入新扩展区域             通过mmap()修改区域。碎片问题对MAP_NOSYNC特别敏感             页面,因为页面可能会被刷新到磁盘中             完全随机的顺序。"

我得出的结论是,虽然Linux或Solaris手册页没有这样的警告,但问题必须存在同样的问题。该怎么办是另一个问题 - 如果文件的最终大小在开头是未知的,那么在整个文件上写零并不是一个好主意。可能强制使用大页面可能有所帮助,但这种性质的任何解决方案都将是特定于平台的。