2011-08-04 7 views
1

代替の空のブロックとデータブロックを含む疎なファイルを作成するための1つのプログラムを作成しました。 は、例えばBLOCK1 =空、BLOCK2 =データ、BLOCK3 =空.....ext3とXFSの代替データと穴を持つ疎なファイルを作成する

#define BLOCK_SIZE 4096 
void *buf; 
int main(int argc, char **argv) 
{ 
buf=malloc(512); 
memset(buf,"a",512); 
int fd=0; 
int i; 
int sector_per_block=BLOCK_SIZE/512; 
int block_count=4; 
if(argc !=2){ 
     printf("Wrong usage\n USAGE: program absolute_path_to_write\n"); 
     _exit(-1); 
} 
fd=open(argv[1],O_RDWR | O_CREAT,0666); 
if(fd <= 0){ 
     printf("file open failed\n"); 
     _exit(0); 
} 
while(block_count > 0){ 
     lseek(fd,BLOCK_SIZE,SEEK_CUR); 
     block_count--; 
     for(i=0;i<sector_per_block;i++) 
     write(fd,buf,512); 
     block_count--; 
} 
close(fd); 
return 0; 
} 

と仮定するため、私はこの上記のコードを使用してnew_sparse_fileを作成します。

ブロックサイズ4KBのext3 FSで、ls -lhはnew_sparse_fileのサイズを16KBと表示しますが、du -hは8KBですが、正しいと思います。

xfsでは、ブロックサイズは4kb、ls -lhは16KBですが、 `du -h *は12kbです。

なぜさまざまな種類の動作がありますか?

答えて

0

スパースファイルはスペースの最適化に過ぎず、どのFSでもファイルの断片化やファイルアクセス速度を最適化するためにスパースファイルを作成しないことがあります。だから、あなたはファイルがいくらかのFSにどれだけ余裕があるかに依存することはできません。

XFSの12kbも正しいです。

+0

ファイルの200メガバイトが書かれているように、私はBLOCK_COUNTを増加させました。 ls -lhは両方のFSに対して200MBを表示しますが、du -hはXFSで187MB、ext3で100MBを示します。いくつかの違いは、ファイルの断片化とファイルのアクセス速度を最適化するには? – Anon

+0

4kbの最小サイズのブロックで多くを埋めるのではなく、ブロックサイズを増やしてください。 '#define BLOCK_SIZE 4096'を' #define BLOCK_SIZE(4096 * 32) 'に変更することを意味します。 – osgx

+0

はい、ブロックサイズを増やすことはできますが、1ブロックホール、1ブロックデータ、1ブロックホール、1ブロックデータがあるようなファイルは作成されません。 ..系列のタイプ。 – Anon

関連する問題