我所知道的增加文件大小最快的方法是使用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;
}
我可以进行实验,看看这些方法和页面大小哪个更快。但是,是否有另一种被认为是扩展文件的正常最佳实践的方法?还有其他方法需要进行性能测试吗?
谢谢。
fallocate
的源代码。 - merlin2011