linux/cで数千のファイルを高速に開く

私は各フォルダと画像ファイルをスキャンするSDCARDスキャナをやっています。

I am using C code & using opendir, readdir, fopen APIs to enumerate directory and file open. i have dirent, DIR variables.

問題はfopen()がディレクターのトラバースに25秒かかりますが、時間がかかりすぎる(10000ファイルでは300秒)。

私は、ディレクトリハンドルまたは同様のものを使用してファイルを開くことができるように、ハンドル、dir_inoまたは同様のものを使用して、ファイルのオープン操作をスピードアップできる任意のAPIはありますか?

So far i have looked n tried to use dirent->dir_ino, DIR* but no luck.

私はfopenよりも時間がかからない低レベルAPIを求めています。

編集 ftsとftw apisは役に立ちますか?彼らはディレクトリをトラバースするだけに関連しているようです...他のハックや方法?

5
nl ru de
速度の制限はAPIからではなく、SDカード自体から来ます。
追加された 著者 mouviciel,
わかりました。私はこの質問について私はちょっと知っていましたが、私がコメントといくつかの提案を見るほど、私は本当に興味をそそられています。 OPに+1。興味深い主題。
追加された 著者 WhozCraig,
@サイモン私はそれがAndroidシステム上にあるからだと思います。
追加された 著者 Olaf Dietsche,
@mouviciel:そうですが、 fopen はファイル名をとります。つまり、プログラムが探していたディレクトリを再訪します。ファイルシステムやブロックデバイスのいずれかがディレクトリリストをキャッシュすることによって不必要なディスク(カード)の活動を避けることを望むでしょう。あなたが本当に運が良ければ、アンドロイドはそれが保証するものをいくつか提供します。
追加された 著者 Steve Jessop,
編集する前に、なぜAndroidタグですか?
追加された 著者 Simon,
@SteveJessop okey dokey、ちょうどチェック。
追加された 著者 Simon,
@SteveJessop、ありがとう、はい私はその方向のみの解決策を探しています...私は葉のディレクトリ(ファイルが配置されている)に達したら、ディレクトリまたはいくつかのハンドルを使用してファイル名で開くことができますか?
追加された 著者 JRC,
私はmouvicielのSDカードコメントよりも2番目です。あなたのコードを書き直すには、あまりにも曲がってしまう前に、それを実際のディスクでベンチマークしてください。 SDカードは、SATAドライブより50倍遅くすることができます。
追加された 著者 Peter Krnjevic,

1 答え

唯一の「低レベル」機能は open です

int fd = open(dirent->d_name, O_RDONLY);

しかし、 fopen はずっと遅くすべきではありません。

1
追加された
@JRCファイルを開く場合は、 open または fopen の周りには何もありません。 strcpy strcat を使用して完全なパスを文字配列に連結すると、もちろん chdir の呼び出しを避けることができます。
追加された 著者 Olaf Dietsche,
@JRCできません。 DIR readdir の意味のみを持ち、inoは低レベルのファイルシステム構造です。 DOSのfsには、例えばinoはありません。
追加された 著者 Olaf Dietsche,
@JRC私は自分自身を使ったことはありませんでしたが、 fts のマニュアルページは readdir と変わりませんし、 ftw これはファイルを開きます。
追加された 著者 Olaf Dietsche,
@JRCいいえ、ごめんなさい。唯一の方法は、 fts または ftw がそれ以上速いかどうかをテストすることです。
追加された 著者 Olaf Dietsche,
ありがとうOlaf、上記のAPIは、d_nameが現在の作業ディレクトリに属している場合にのみ有効なfdを返します。私がchdir()を呼び出すと、ほぼ同じ時間がかかる... chdir()を避けるか、ディレクトリハンドルでopenを呼び出す方法がある。
追加された 著者 JRC,
DIR *とstruct dirent.d_inoの値はどのように使用できますか?
追加された 著者 JRC,
ftsとftw apisは役に立ちますか?彼らはディレクトリをトラバースするだけに関連しているようです...他のハックや方法?
追加された 著者 JRC,
OK。ファイルのオフセットやディレクトリのオフセット、さらには高速のファイルハンドルについての考えはありますか?ありがとう
追加された 著者 JRC,