- ベストアンサー
ディレクトリ内のファイル名取得
- ディレクトリ内のファイル名を取得する方法について
- ファイル名を取得するだけで時間が掛かる問題に対する解決策
- 高速にファイル名を取得する方法を知りたい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>(1)だけが異様に時間掛かってました 約17秒ぐらい ファイルのキャッシュが効く2回目以降の実行でもそれほど時間がかかるなら、 dp[]が大量にメモリを消費しますから、 ページアウトしてたりするんじゃないでしょうか?
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ウチのcygwin + gcc で実際に簡単なサンプルを書いて実験してみた処 100000コのファイルの探索では、ほとんど有意な差はありませんでした。 (1)scandirを使う方法 (2)readdirを使う方法 (3)パイプでlsからの出力を使う方法 の3つを試してみたのですが、 どれも、1秒未満で終了してしまいます。 何回も試しているので、ファイルアクセスのキャッシュの効果があると思いますが、それほど変わらないようです。 一応 timeコマンドで時間を測定してみた所 (3)>(2)>(1) の様にはなっていました。 単に処理の複雑さが(3)<(2)<(1)になっているためと思われます。
補足
実際に実行してくださって ありがとうございます!! やはり 数が数なだけにいちいちソートしてたら 遅くなるのが当たり前ですよね・・・ 私の所では、(2)と(3)が同じくらいの速度で 1秒掛からないくらいでした。 (1)だけが異様に時間掛かってました 約17秒ぐらい
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1です 見当違いなことを言ってすみません。 今のプログラムだと、scandirが終了するまで待たないといけないので、こういう部分を別プロセスにすることで、スピードアップが図れるかもしれません。 プログラム的には、実際に別プロセスにするプログラムを書くより ls -l || thisProg のようにパイプを使うのが簡単の様に思います。 windowsの様に、前のコマンドが終わってからしか動かないというようなことが、UNIX系ではないと思いますので、スピードアップが図れると思うのですが、どうでしょうか? 実際に試した訳ではないので、自信はないですけど。
お礼
いえいえ よく考えて見ると BLUEPIXYさんの言っていた >>あらかじめ、lsでファイル名のファイルを作っておくのも1つの方法かと思います。 を使えないかと考えていたところ 動的に増えていくファイルだけじゃない所もあるので そこを ファイルリストを作って少しでも負担を軽く出来るように作り直してみます。 パイプの方は、このファイル名が取得出来ないと 次の処理が出来ないのでちょっと難しいです。 出来れば PHPにあるsqliteのような簡単なデータベースが c言語にもあれば一番いいのですが・・・ないですよね?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
動的に取得する必要がないなら、 あらかじめ、lsでファイル名のファイルを作っておくのも1つの方法かと思います。 検討違いだったらすみません。
補足
アドバイスありがとうございます。 すいません私の説明不足でした。 目的のファイルは 結構頻繁に増えるので動的に取りたいと思っています。
お礼
ここまでつきあって頂き有難うございます。 どちらにしろ この3通りの方法での共通した問題は 初回実行時のキャッシュがない時に時間が掛かってしまうこと これは、もうどうしようもないように思えます。