增加文件大小的最快方法是将ftruncate()或lseek()调整为所需大小并写入单个字节。在这种情况下,这不符合我的需要,因为文件中产生的漏洞不会在文件系统中保留空间。
是使用calloc()和write()的最佳替代方法吗?
int increase_file_size_(int fd, int pages) {
int pagesize = 4096;
void* data = calloc(pagesize, 1);
for(int i = 0; i < pages; ++i) {
// In a real world program this would handle partial writes and interruptions
if (write(fd, data, pagesize) != pagesize) {
return -1;
}
return 0;
}
使用writev可能会更快。 下一个版本应该更快,因为calloc必须初始化更少的内存,并且更多的数据适合CPU缓存。
int increase_file_size_(int fd, int pages) {
int pagesize = 4096/16;
void* data = calloc(pagesize, 1);
struct iovec iov[16];
for(int i = 0; i < 16; ++i) {
iov[i].iov_base = data;
iov[i].iov_len = pagesize ;
}
for(int i = 0; i < pages; ++i) {
// In a real world program this would handle partial writes and interruptions
if (writev(fd, data, pagesize) != pagesize * 16) {
return -1;
}
return 0;
}
我可以尝试看看这些方法中的哪一种以及哪种页面大小更快。但是,是否有另一种方法被认为是扩展文件的正常最佳做法?还有其他方法我应该进行性能测试吗?
谢谢。
答案 0 :(得分:2)
查看posix_fallocate()
函数:它为文件保留空间,而不必写入任何数据来占用该空间。分配的空间有点像稀疏文件,即使您没有明确地向其中写入任何内容,您也可以从中读取它,但与稀疏文件不同,它实际上减少了文件系统中的可用空间量。您确信以后可以在不用空间的情况下写入该文件的该区域。
请注意,如果您在写入之前阅读它,posix_fallocate()
似乎无法保证所分配空间的内容。我认为Linux实现将返回所有零字节,类似于稀疏文件,但您可能不应该依赖它。在你写一些真实的东西之前把它当作垃圾。
另请注意,并非所有文件系统驱动程序都支持posix_fallocate()
利用的预分配功能,而且如果预分配不是&#,我认为它会依赖于实际将数据写入文件(正常方式) 39;支持。典型的Linux文件系统如ext4和XFS都可以,但如果你尝试使用FAT或NTFS这样的程序,你的程序可能会在I / O上暂时阻塞一段时间。