2

理論的な答えを使用できる質問があります。

特定の属性を持つすべてのファイルについて、100 TB を超える大規模なボリュームを検索しています。これを行うために、私は「find」コマンドを使用してきました。

つまり、妥当な時間内に実行することを除きます。いずれにせよ、巨大なファイルシステムをトラバースするには時間がかかることはわかっていますが、考えられる解決策が思い浮かびました。

可能であれば、再帰的に ls と grep を使用するとどうなるでしょうか? 注: 以下のコードは、構文的に正しいことを意図したものではありません。説明用です。

my_ls{
    # get a listing of all files in the directory passed
    var=`ls -lsa $1`
    # iterate over each file/directory returned by ls
    for each file/directory in $var
        if $each is a directory
            my_ls $each
    done
    # search the lines output from ls for the attributes
    echo $var | grep $searchstring
}

このアイデアは、大規模なファイルシステムを検索するよりも全体的に高速ですか? メモリ要件は潜在的に急速に大きくなる可能性がありますが、それほど大きくはありません。これを並列化し、処理を高速化するためにスレッドを GPU にオフロードすることも可能かもしれません (私が知っている bash ではありませんが、一般的に)。

編集:はい、ほとんどの場合、io バインド操作の並列化を提案することについて、私はかなり薄暗いです。

4

3 に答える 3

5

lsandを使用すると、grep速度が低下するだけではありません (分岐、待機、パイプラインへの読み取りと書き込みなどのオーバーヘッドが追加されます)。それも間違っています。

スクリプトでの使用がなぜ悪であるかの説明については、http://mywiki.wooledge.org/ParsingLsを参照してくださいls(「バグが発生し、セキュリティを悪用できる」という意味で)。

于 2013-01-03T16:31:42.923 に答える
4

私は、プロセスを繰り返し生成するオーバーヘッドが、リソースの消費量をはるかに上回っているのではないかと強くfind思っています。リソースのボトルネックがどこにあるかを検討する必要があります。ファイル システムをナビゲートする場合、それはディスク アクセスになります。CPUは無視できます。

于 2013-01-03T16:27:42.330 に答える
2

いいえと思います。どちらも同期操作ですが、再帰するにはまったく新しいプロセスを開始する必要があり、それには独自のオーバーヘッドがあります。操作を高速化したい場合は、map/reduce モデルを使用することをお勧めします。

通常、ファイルまたはデータベースの内容を解析するときに map/reduce が使用されますが、このアイデアは状況に合わせて調整できます。map/reduce の概要は次のとおりです: http://www-01.ibm.com/software/data/infosphere/hadoop/mapreduce/


編集:

ここで多くの人が指摘しているように、これは IO バウンド プロセスであり、map/reduce の典型的な実装は、多くのマッパーとリデューサーを備えた並列システムですが、これは、タスクを map 関数に分割することでメリットが得られないという意味ではありません。そしてリデュース機能。map/reduceモデルは今でも役に立ちます。

私が提案していることについては、マッパーは、指定されたパスの下にあるすべてのファイルを再帰的に見つける 1 つのスレッドである必要があります。次に、レデューサーは、ファイルが適切なユーザーによって所有されているかどうか (または任意の述語) を評価します。

これにより、IO が評価から切り離されます。つまり、IO スレッドが評価のために一時停止することはありません。これは、ファイルごとに 1 マイクロ秒しか節約できないかもしれませんが、大規模なファイルシステムでは、大幅な節約になる可能性があります。

私が説明しているのは、人々が知っていて使い慣れている正確な map/reduce ではありませんが、有用な出発点として十分に類似しています。

于 2013-01-03T16:28:09.033 に答える