ファイル マッピングを使用して、私が取り組んできたいくつかの大きな配列を使用するプログラムのメモリ フットプリントを削減しています。これらの配列の目的のサイズがわからないため、配列が到達しないことがわかっているレベルまでサイズを過大評価し、ファイルを最終的なサイズに切り詰めて配列を完成させています。幸いなことに、マップされたファイルを作成するために使用しているコード (この投稿の下部) は、試したすべてのマシンでスパース ファイルを作成します。そうでない場合は、ディスク容量の問題が発生します。
質問は: スパース ファイルを作成することが保証されているマッピングの前に lseek を呼び出してファイルを拡張するか、または少なくとも合理的な Linux ディストリビューションと Solaris でそうすることに依存できますか。
また、数百 GB の非スパース ファイルを作成するよりも終了する方がよいため、作成されたファイルがスパースであることを確認する方法はありますか。
output_data_file_handle = open(output_file_name,O_RDWR | O_CREAT ,0600);
lseek(output_data_file_handle,output_file_size,SEEK_SET);
write(output_data_file_handle, "", 1);
void * ttv = mmap(0,(size_t)output_file_size,PROT_WRITE | PROT_READ, MAP_SHARED,output_data_file_handle,0);