• 締切済み

ファイル検索のアルゴリズムについて

ファイル検索のアルゴリズムで一番高速なアルゴリズムについて教えて下さい。 やりたいことは、 あるフォルダ以下のファイル(フォルダであれば更にその下まで)検索し、 現在の時刻から一番近い更新日時の早い順にファイルを10個検索するというものです。 ファイル本体をすべて検索するプログラムについてはできていまして、 現在の時刻から一番近い更新日時の早い順にファイルを10個検索する方法に関して 高速なアルゴリズムがありましたら教えて下さい。 プログラミング言語がPHPなのでPHPで実現可能なアルゴリズムですと嬉しいです。

  • PHP
  • 回答数5
  • ありがとう数1

みんなの回答

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.5

PHPのロジックとしては 該当ファイル取得 >> 各ファイルの更新時取得・配列生成 >> ソート >> 必要件数の取り出ししかないでしょう。 とりあえず10件更新日時を取得したら一旦ソートし、それ以降は10番目より新しい場合のみ配列に入れる等、小手先の方法はあるでしょうが煩雑になりそうです。 あるいはファイル名をタイムスタンプにすれば少しはよいかも知れません。 コマンドが利用できるのであれば $newfiles = shell_exec("find ./data -mtime -31 -name '*.mp3' | xargs ls -l --time-style=long-iso | sort -k 6,7 -r | head -10"); のような方法もあるにはあります。 (./data 以下の1ヶ月以内に更新されたmp3ファイルから新しいものを10行取得 ※環境で若干異なる) どちらにしてアクセスの度実行するのではなく、既回答のようにリストを生成しておき、ファイル更新時にリストも自動更新する方がよいかと。 ただ、ごちゃごちゃやるより、将来的なことも考えるとやはりSQLにすべきケースです。 理由はAno4さんの通り。他アクセス順/人気順など件数も含めて好きなように応用可能です。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.4

私も「データベースを使う」に一票。 更新日時でもアーチスト名でも思いのままに検索出来ますからね。またファイル自体は特定のディレクトリに(重複さえしなければ)適当な名前で保存出来ますし、アーティスト名やアルバム名に(ファイル名がタイトルであればタイトルにも)「ファイルシステムで使えない文字」でも利用できます(ディレクトリ名にするわけではないので)。 最初にデータベース化するときにはFTPされたファイルを検索してinsertを繰り返す必要がありますが、追加していくときにはブラウザからの(アーティスト名やアルバム名を入力しての)アップロード処理で作れますよね。提示されたような階層構造だとFTP以外で追加するのは面倒です(前述のファイルシステムで使えない文字のチェックとかもありますから)。

noname#244856
noname#244856
回答No.3

「クイックソート」について述べられていますが、この問題とはあまり関係ない気がします。 C言語レベルで int arr[] = { 3, 5, 1, 2, 4, 7 }; のような配列をソートするのとは本質が異なります。 今回一番ネックになってくるのが「更新日時の取得」です。 更新日時の取得 filetime関数 http://php.net/manual/ja/function.filemtime.php ソートアルゴリズム云々以前にこれを6000回も毎回コールするのはさすがに正気とは思えませんね。 また、全ファイルの更新日時が格納された配列があるにしても、PHPレベルだと sort($arr); これで終了です。 ソートアルゴリズムの中身はPHP言語に実装されています。 PHP言語がC言語によって書かれていることはご存知ですか? 参考 http://d.hatena.ne.jp/suztomo/20080605/1212687962 【解決策】 データベースを利用する

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

6,000件もあるとすると、配列使うのは きっと効率が悪いですね。 そもそも検索時に毎回総当りをする事が効率悪いです。 初回検索時に、リスト作っておいて、 ファイルの追加や削除のタイミングでリスト更新するのが良いかも。 PHP側でファイルの追加や削除を監視できていなければダメですけど。 DBが使える環境なら、その方がいいですし。 毎回総当りをする前提なら、早いかどうかは別として、配列に入れてPHPにソートしてもらうのが楽です。 日時をキーとする場合、キーの重複に気をつけないといけないですけど。 最速なのかと問われると、いろいろ試してみないと分かんない。と言うのが正直な本音です。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

どんだけのファイルを扱おうとしているのか分かりませんし、実際速さがどんなもんか分かりませんが、自分なら こうするかな程度の案です。 ファイル本体をすべて検索する時点で、日時をキーにして配列に入れておいて、後でソートするとか。 すべて検索する時点で、随時 順位づけするとか。 前回検索時の状態を保存しておいて、それ以降に追加変更された差分だけやるとか。 扱うファイル数と稼働状況によりけりという感じですかねー。

kracfire
質問者

お礼

御回答有り難うございます。

kracfire
質問者

補足

一番肝心な情報が抜けていましたすみません。 扱うファイルは音楽ファイルで6000曲ほどが ルート→アーティスト名→アルバム名→ファイル という階層構造で分類保存されています。 この量程度のファイル数ですと日時キー配列作成の後のソートアルゴリズムはクイックソートがやはり最速なのでしょうか?

関連するQ&A

  • アルゴリズム

    phpってほかの言語と違い「アルゴリズム」とかはないのでしょうか? phpでログインフォームや掲示板などの基準となる作り方を知りたくて 「php アルゴリズム」 と検索したところ結果ヒットする物はほぼなくて https://teratail.com/questions/35223 こちらのページが気になり見たところ、 「phpはあまりメモリを操作する言語ではないためアルゴリズムはない」 との回答がありました。 phpにアルゴリズムってないのでしょうか? 「ログインフォーム 作り方」で検索したところヒットはあるため、 phpは「アルゴリズム」というより「作り方」のほうがよいのでしょうか?

    • ベストアンサー
    • PHP
  • vistaでフォルダ内のファイルの整列を固定化し

    たとえば写真フォルダやは更新日時順で、動画ファイルや音声ファイルは名前順でといった具合に 各フォルダによって整列の仕方を固定したいのですが、現在はすべてのフォルダが更新日時順で固定化されています。 これを矯正したいです、よろしくお願いします。

  • フォルダー内のファイルの並べ方

    フォルダー内のファイルの並べ順を「更新日時」とすると、作成日時が古い順に並びます。もう一度「更新日時」をクリックすると、新しい順に並びます。最初のクリックで新しい順に並ばせることは出来ないのでしょうか。

  • windows7 更新時刻で検索

    windows7 64bit版を使用しています。 各フォルダ・ファイルには更新日時が記録されますが、更新時刻からドライブ内のフォルダ・ファイルを検索することはできますか? 当方で調べた所、日付単位での検索方法しか出てこなかったのですが、時間単位で検索したいです。 例えば2012年9月10日21時30分に更新したものを検索するにはどうすればいいのでしょうか。

  • 検索結果を最新ファイルのみ1フォルダにコピーするには?

    はずかしながら、ソフトウェア業界にいる者ですが、 検索結果のファイルを最新ファイルのみ残す( 複写)で うまくいかないので、他に方法がないか教えて頂きたいのです。 コマンドまたはユーティリティ、フリーソフトでの方法がありましたら 教えて下さい。 WINDOWS98SEにて、1998年から2005年までの1000近い仕様書ドキュメントを 検索にて検索結果を表示させて、1フォルダに最新のバックアップとして まとめコピー(複写)させようとしていますが、 ドキュメントは修正時の各フォルダに名称同一のまま格納されているため 検索結果を更新日付時刻順(昇順)で表示させた後、 全選択し、ドラッグ&ドロップで別フォルダに複写します。 (同一ファイルは「全て上書き」を指定する) しかしながら、更新日付時刻順(昇順)で複写されなく、 格納順で格納されるケースがあり、 現状では、1ヶ月単位の選択範囲を決めてコピーしています。 いい方法教えて下さい。

  • 以前(XPを含んだ以前)のように、更新順にファイルを並び替えられないか

    以前(XPを含んだ以前)のように、更新順にファイルを並び替えられないか? 現在、ビスタを使っています。ネットからダウンロードした動画をDドライブの 「video」フォルダ(←これは自分で作ったフォルダか、既定のフォルダか忘れてしまいましたが。)に 保存しています。 これらの動画を更新順(日付順)に並び替えたいのですが、上部の タブ(?)が名前、撮影日、タグ、サイズ、評価の四つしかなく「更新日時」 というのがありません。よって、更新日時順に並べ替えができないのですが、 更新日時順に並び替える方法はあるのでしょうか? ちなみに、「撮影日」というのがありますが、ダウンロードした画像の ファイル情報には撮影日のデータは入っていません。入っていたとしても、 並び替えたい順はあくまで「更新日時」(=ダウンロードした日)と したいのです。 どうぞお知恵を拝借させてください。 よろしくお願いします。

  • C言語のアルゴリズムについて

    C言語をやっているんですが アルゴリズムとはどういうものなのでしょう? 難しくて理解できないんですが ファイル検索(grep)みたいなのや 置換ソフトみたいながアルゴリズムなんでしょうか? 作るーー>ソフト みたいな感じなんでしょうか? どなたか詳しく教えてくださいお願いします

  • vistaでファイルを更新日時順に並べるには

    動画や画像を見るとき一番新しく保存したファイルを見たいのですが、 何回更新日時順に並べても次にフォルダを開いたときには名前順に並び戻されてしまいます。 更新日時順で固定させたいのですがどうすればいいでしょうか。

  • タグ検索やキーワードによる分類について

    youtubeやはてなでは、キーワードやタグ検索ができますが、 どうやって実現しているのでしょうか? TAGGYのようなものを作りたいと考えています。 参考になるホームページやプログラミング書籍を教えてください。 プログラミング言語はjava, ruby, phpなんでも構いませんので 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ファイルの更新がフォルダの更新日時に反映されま

    XPのPCです。外付HDDが2台(両方バッファロー製です)あるのですが、その内の1台がフォルダ内のファイルを更新したり、新しいファイルを作成しても更新日時が変更されません。ファイルとフォルダの更新が連動していないのです。フォルダの更新日時はそのフォルダ内のファイルを新しく作っても、またファイルを更新してもフォルダの詳細(更新日時)はフォルダ作成日時のままです。フォルダ内のファイルの更新日時は変更されています。フォルダ名を検索したり作成日時を予想して並び替えれば見つけることはできるのですが、実際、フォルダが更新日時順に▼にならないと結構不便です。 他の外付HDD・内蔵HDDはファイルとフォルダの更新は連動(反映)されます。フォルダオプションの表示の設定は同じ設定にしていると思うのですが・・・ ネットワークの共有で他のPC(W7)から同外付HDDを操作しても変わりはありません。 HDDのファイル更新をフォルダ更新に反映(連動)する方法をご存知の方は方法を教えて下さい。 よろしくお願いします。

専門家に質問してみよう