C 将文件写入连续内存块

C 将文件写入连续内存块,c,memory,filesystems,contiguous,C,Memory,Filesystems,Contiguous,我不断地用ext4文件系统将100mb文件写入磁盘,当磁盘满时,我只删除最旧的文件并写入新的文件。这些文件永远不会在侧面生长。当我这样做时,文件系统会在一段时间后变得非常零碎。我已经研究了ext4的所有格式选项,但还没有弄清楚为什么会出现这种碎片 基本上,为了简化问题,我所做的是在一个循环中执行以下操作: int32_t fid = open(filepath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); int success = fallocate(fid,

我不断地用ext4文件系统将100mb文件写入磁盘,当磁盘满时,我只删除最旧的文件并写入新的文件。这些文件永远不会在侧面生长。当我这样做时,文件系统会在一段时间后变得非常零碎。我已经研究了ext4的所有格式选项,但还没有弄清楚为什么会出现这种碎片

基本上,为了简化问题,我所做的是在一个循环中执行以下操作:

int32_t fid = open(filepath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
int success = fallocate(fid, 0, 0, MAX_FILE_SIZE);
close(fid);

有没有办法告诉文件系统以连续块的形式将数据写入磁盘?我看过其他帖子,但我还没有完全弄明白。我是否应该使用malloc()而不是fallocate()?

Ext4可选地支持“区段”,即连续的磁盘块。必须使用tune2fs启用该支持。以下是一些有用的链接:


我不认为应该将其标记为c++只是猜测,但碎片可能是因为分配给目录的空间(或添加日志文件等无关活动)在文件之间?如果你释放了一个100MB的文件,而其中一个块被用于其他用途,那么你随后立即编写的100MB文件,认为你只是在替换它,实际上会被分割。这是你漂亮的连续磁盘楔的薄端。或者,如果您的可用空间不是100MB的倍数,那么当您删除一个文件时,不能保证下一个文件将在存根结束之前首先使用其空间。实际上,我总是删除旧文件,以便可用磁盘空间是文件大小的3倍(即,在我的情况下,至少有300MB的可用空间)。我希望这将为新文件提供至少一个连续范围的空间。即使我将可用磁盘空间设置为更大的空间,即1GB,碎片也会在一段时间后出现。看起来fallocate即使在可用的情况下也不会分配连续的磁盘空间。对吗?谢谢你的回复。如果我理解正确,将磁盘格式化为ext4时,扩展数据块默认为打开状态。我还尝试显式地打开扩展,但没有任何区别。嗯。。。您的文件系统是否承载临时文件、日志或与特定工作无关的一般其他活动?据我所知不是这样。日记会导致这些临时文件吗?不,据我所知。或者,至少,如果有,它没有被记录…:-(