11

Linux を実行している組み込みデバイスで、後で書き込むことになる大きな穴が最初にあるファイルを作成することが目的であるとしましょう。ファイルを開き、ファイル記述子を取得し、lseekそれを呼び出して特定の既知の位置をシークします。その後、シーク先の位置でそのファイルに書き込みたい場合は、それを呼び出しますwrite

ただし、最初の書き込みでは、シークによって作成された穴がゼロで埋められ、穴が十分に大きい場合、この操作には時間がかかる場合があります。私のアプリケーションでは、穴は正確な長さであり、後でデータで埋めるため、このゼロ初期化は必要ありません。

write穴をゼロで埋めた後の最初の呼び出しを回避する方法はありseekますか (ファイルシステムドライバーの変更を伴う場合でも)? または、ファイルの先頭の前にファイルに書き込む方法はありますか (ファイルの先頭に追加します)。

4

4 に答える 4

8

これはファイルシステムに関連している可能性があります。ext2/3/4、reiser、btrfs、xfs などでは、「スパース ファイル」と呼ばれるものをサポートしているため、説明したことを実行するのに時間がかかることはありません。ファイルのサイズ (ゼロの実行は物理的に保存されないため)。

ddこれが事実であることを確認するために、次の実験を試すことができます。

$ dd if=/dev/zero of=whatever bs=1k seek=1073741824 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 9.1878e-05 s, 11.1 MB/s
$ ls -al whatever
-rw-r--r-- 1 xxxx xxxx 1099511628800 Jan 31 18:04 whatever
$ du -h whatever
16K whatever

ファイルシステムでは、おそらく失敗します。その場合、スパース ファイルを作成する必要がある場合は、別のファイル システムを使用できるかどうかを判断します。

于 2016-02-01T00:05:47.030 に答える
1

ただし、最初の書き込みでは、シークによって作成された穴がゼロで埋められ、穴が十分に大きい場合、この操作には時間がかかる場合があります。

いいえ、できません。指定したデータを に書き込むだけですwrite()。書き込まれていない部分のゼロは、物理的には存在しません。ファイル システムのアーティファクトです。

于 2016-02-01T00:06:21.767 に答える
-1

フラグMAP_UNINITIALIZEDを使用しようとしましたか?

于 2016-01-31T23:56:37.210 に答える