3

私は現在、パフォーマンスの面でI / Oに非常に敏感なコードに取り組んでおり、Unixの下のディレクトリをCコードから削除する最速の方法を探しています。すべての一般的なプラットフォーム(Android、MacOS X、Linux)で動作するものを書きたいのですが、Unixの異なるフレーバーに対して異なる実装を書きたいと思っています(BSD /MacOSXとLinux/Androidには異なるトリックがあると思います)。

これが私の頭に浮かんだいくつかのことです:

  • すべてのプラットフォームで、ディレクトリをファイルと区別するために、などを使用してディレクトリ構造をたどることができます。これはLinuxでは標準化されているようですがopendir、MacOSXでは標準化されていません。readdir_rdirent->_d_type

  • Linux / Androidでは、このオプションを選択すると、各ファイルをすばやく削除するために使用することもできdirfdますunlinkat

  • すべてのプラットフォームで、ディレクトリとファイルを区別するためにftw、を使用してディレクトリ構造をたどることができます。flag

  • すべてのプラットフォームで、ディレクトリとファイルを区別するために、などを使用してディレクトリ構造fts_openをたどることができます。fts_readFTSENT->fts_info

  • 確認していませんが、BSD /MacOSXcopyfile機能でディレクトリを削除できる印象があります。

これらの手法の1つは、他の手法よりも厳密に優れていますか?明らかな何かが欠けていますか?

私は主にI/Oを最小限に抑えることに関心があり、より一般的にはシステムコールに関心があることに注意してください。CPUコストについてはあまり貪欲ではありません。

ありがとう

4

1 に答える 1

3

おそらく、ディレクトリを削除する最も速い方法は、削除しないことです:-)

または、より正確には、それを延期します。単純に (たとえば) を取り除くことが目的の場合は/home/pax/porn、単純mvに同じファイル システム ( /home/no_user/junk/pax/porn) の別の場所に移動し、バックグラウンド プロセスを開始して、優先度の低いプロセスでそれを取り除きます。

また、優先度が低いということは、必ずしも CPU のうなり声を意味するわけではなく、必要に応じてリソースの使用を最小限に抑えるためにプロセスが実行することを意味します。

たとえば、この I/O 効果を長期間にわたって分散させる必要がある場合は、その間に遅延を設けてファイルまたはディレクトリを削除するプロセスを作成できます。すべてのファイルを一度に削除した場合と同様の I/O が発生する可能性がありますが、短期間で測定された I/O はそれより少なくなります。

この方法の利点は、「削除」したディレクトリを探しているプロセスによれば、すぐになくなってしまうことです。

もちろん、ディスク容量を回復するにはしばらく時間がかかります。これは遅延して行われるためです。ただし、それが重要かどうかは、相対的な優先順位によって異なります。

于 2012-05-15T12:52:03.050 に答える