FTP プロトコルを使用して (UNIX mkdir -p と同様に) 再帰的にディレクトリを作成するための一般的に最速のアルゴリズムは何ですか?
私は1つのアプローチを検討しました:
- MKDIR ノード
- エラーと残りのノードが次のノードで 1 になる場合
- 終わり
ただし、ディレクトリの一部が存在する可能性が高い場合、これはパフォーマンスが低下する可能性があります。たとえば、一部の償却では、「/a/b/c/d/e/f/g」パスの「/a/b/c/d」部分が 99% の確率で存在します。
FTP プロトコルを使用して (UNIX mkdir -p と同様に) 再帰的にディレクトリを作成するための一般的に最速のアルゴリズムは何ですか?
私は1つのアプローチを検討しました:
ただし、ディレクトリの一部が存在する可能性が高い場合、これはパフォーマンスが低下する可能性があります。たとえば、一部の償却では、「/a/b/c/d/e/f/g」パスの「/a/b/c/d」部分が 99% の確率で存在します。
コマンドの送信と応答の受信に多くの時間がかかることを考えると、ディレクトリ パスを作成する最速の方法は、できるだけ少ないコマンドを使用することです。
ディレクトリを作成するか cd してその存在を確認する以外に方法はないので、mkdir a; を使用するだけです。mkdir a/b; ...、mkdir a/b/c/d/e/f が一般的に最速の方法です (サブディレクトリに cd して次のディレクトリを作成しないでください。これはプロセスが長引くためです)。
この方法で複数のディレクトリを作成すると、もちろん、作成済みの最上位ディレクトリを追跡できます。また、パスの長さと上位ディレクトリが既に存在する可能性に応じて、たとえば mkdir a/b/c (a/b/c/d/e/f の場合) から開始して、場合によってはバックトラックを試みることができます。それは成功しませんでした。ただし、ディレクトリが存在しない可能性が高い場合、長期的には実際には遅くなります。
既存のディレクトリ階層が任意の深さで終了する可能性が等しい場合、開始位置のバイナリ検索が最速の方法になります。しかし、dseifert が指摘しているように、ほとんどの場合、ディレクトリがすでにレベル k まで存在している場合、レベル n/2 よりもレベル k でバイナリ検索を開始する方が高速です。
ところで、この種の最適化を時間をかける価値があるようにするには、非常に深いディレクトリをたくさん作成する必要があります。時期尚早に最適化していないと確信していますか?