io.Copy() で膨張するスパース ファイル
io.Copy() でファイルをコピーすると、大きなスパース ファイルが不釣り合いに膨張する傾向があります彼らの目的地で。この動作は、io.Copy() による raw バイトの処理に起因しており、ファイル ホールに関する情報を伝達する手段がありません。
ホールの処理
ホールを管理するにはの場合は、syscall パッケージをさらに詳しく調べて、lseek(2) の SEEK_HOLE および SEEK_DATA の値をいじる必要があります。残念ながら、これらの値は、標準の syscall パッケージやそれに対応する golang.org/x/sys には存在しません。
解決策
これを解決するには、次の手順に従います。
たとえば、Linux では、以下を使用できます。
// +build linux const ( SEEK_DATA = 3 SEEK_HOLE = 4 )
スパース ファイルの読み取りと転送
データ領域の検出と読み取りスパースファイルの読み取り中にそれらを実行します。スパース性を維持したままファイルを転送する場合、プロセスはより複雑であり、プラットフォーム固有の考慮事項が必要です。
Linux 固有のアプローチ
Linux では、fallocate(2) を次のように使用します。 FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE を使用して、ファイルの末尾に穴を開けます。失敗した場合は、ゼロ化されたブロックをシャベルして穴を隠します。
追加メモ
以上がGo でスパース ファイルを肥大化させずに効率的にコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。