29

私が取り組んでいる製品は、1 日に数千の読み取り値を収集し、NTFS パーティション (Windows XP) に 64k のバイナリ ファイルとして保存します。本番環境で 1 年が経過した後、1 つのディレクトリに 300,000 を超えるファイルがあり、その数は増え続けています。これにより、Windows エクスプローラーから親/先祖ディレクトリにアクセスするのに非常に時間がかかりました。

インデックス サービスをオフにしてみましたが、違いはありませんでした。ファイルの内容をデータベース/zip ファイル/tarball に移動することも検討しましたが、ファイルに個別にアクセスすることは有益です。基本的に、ファイルは依然として研究目的で必要であり、研究者はそれ以外に対処する気はありません。

NTFS または Windows を最適化して、これらすべての小さなファイルを処理できるようにする方法はありますか?

4

14 に答える 14

35

NTFS は、16 ビット Windows プラットフォームと互換性のある代替ファイル名の作成を停止するように指示する限り、ディレクトリ内の 10,000 を超えるファイルで実際に正常に動作します。デフォルトでは、NTFS は、作成されるすべてのファイルに「8 ドット 3」のファイル名を自動的に作成します。Windows はディレクトリ内のファイルを調べて、作成している名前がまだ使用されていないことを確認するため、ディレクトリ内に多くのファイルがある場合、これは問題になります。NtfsDisable8dot3NameCreation レジストリ値を 1 に設定することにより、'8 dot 3' 命名を無効にすることができます。この値は、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem レジストリ パスにあります。'8 dot 3' という名前のファイルは、非常に古いバージョンの Windows 用に作成されたプログラムでのみ必要とされるため、この変更を行っても安全です。

この設定を有効にするには、再起動が必要です。

于 2008-10-24T18:14:43.043 に答える
28

ディレクトリに 10,000 個のファイルがあると、NTFS のパフォーマンスが大幅に低下します。ディレクトリ階層に追加のレベルを作成し、各サブディレクトリに 10,000 個のファイルを配置します。

価値があるのは、これが SVN の人々がバージョン 1.5で採用したアプローチです。デフォルトのしきい値として 1,000 ファイルを使用しました。

于 2008-09-22T16:29:51.987 に答える
9

パフォーマンスの問題は、1 つのディレクトリ内の膨大な量のファイルが原因で発生しています。これを解消すれば、問題ありません。これは NTFS 固有の問題ではありません。実際、大規模な UNIX システムのユーザー ホーム/メール ファイルでよく発生します。

この問題を解決する明白な方法の 1 つは、ファイル名に基づいた名前のフォルダーにファイルを移動することです。ABCDEFGHI.db、ABCEFGHIJ.db など、すべてのファイルに同じような長さのファイル名があると仮定すると、次のようなディレクトリ構造を作成します。

ABC\
    DEF\
        ABCDEFGHI.db
    EFG\
        ABCEFGHIJ.db

この構造を使用すると、名前に基づいてファイルをすばやく見つけることができます。ファイル名が可変長の場合は、ファイルが属するディレクトリを判別するために、最大長を選択し、先頭にゼロ (またはその他の文字) を追加します。

于 2008-09-22T16:33:15.317 に答える
5

過去に、たとえばファイル名の最初の文字、次に 2 番目の文字によって、ファイルをディレクトリのネストされた階層に分割することによる大幅な改善を見てきました。各ディレクトリに過剰な数のファイルが含まれていません。ただし、データベース全体の操作は依然として遅いです。

于 2008-09-22T16:27:55.517 に答える
4

私は過去に何度もこの問題に遭遇しました。日付ごとに保存したり、ファイルを日付の下に圧縮して、小さなファイルがたくさんないようにしたりしました。これらはすべて、データを NTFS にたくさんの小さなファイルとして保存するという実際の問題に対する応急処置でした。

小さなファイルをより適切に処理するZFSまたは他のファイルシステムに行くことができますが、それでも立ち止まって、小さなファイルを保存する必要があるかどうかを尋ねます.

私たちの場合、最終的にシステムに行きました。特定の日付のすべての小さなファイルが、それらを解析するための単純な区切り文字を使用して TAR タイプの方法で追加されました。ディスク ファイルは 120 万から数千以下になりました。NTFSは小さなファイルをうまく処理できないため、実際にはロードが速くなり、ドライブは1MBのファイルをキャッシュするのに適していました. 私たちの場合、ファイルの適切な部分を見つけるためのアクセスと解析時間は、保存されたファイルの実際の保存とメンテナンスに比べて最小限でした。

于 2008-09-22T16:44:23.387 に答える
4

ファイルの名前を計算できる場合は、日付ごとにフォルダーに並べ替えて、各フォルダーに特定の日付のファイルのみが含まれるようにすることができます。月と年の階層を作成することもできます。

また、たとえば 1 年以上前のファイルを別の (ただしアクセス可能な) 場所に移動できますか?

最後に、繰り返しになりますが、これには名前を計算できる必要があります。ファイルに直接アクセスする方が、エクスプローラーで開こうとするよりもはるかに高速であることがわかります。たとえば、コマンド ラインから
notepad.exe "P:\ath\to\your\filen.ame"
と実行すると、ディレクトリ リストを取得しなくても必要なファイルのパスがわかっていれば、実際にはかなり迅速に実行できます。

于 2008-09-22T16:27:36.467 に答える
4

Solid File System などを使用してみてください。

これにより、アプリケーションが物理ディスクであるかのようにマウントできる仮想ファイル システムが提供されます。アプリケーションは多数の小さなファイルを認識しますが、ハード ドライブにあるファイルは 1 つだけです。

http://www.eldos.com/solfsdrv/

于 2008-09-22T16:31:47.270 に答える
3

1 つのディレクトリに何十万ものファイルがあると、実際に NTFS が機能しなくなります。これについてできることはあまりありません。1 つの大きな tarball やデータベースなど、より実用的な形式でデータを保存することを再検討する必要があります。

読み取りごとに個別のファイルが本当に必要な場合は、それらをすべて同じディレクトリに置くのではなく、いくつかのサブディレクトリに分類する必要があります。これを行うには、ディレクトリの階層を作成し、ファイル名に応じてファイルを別のディレクトリに配置します。このようにして、ファイル名だけでファイルを保存およびロードできます。

私たちが使用する方法は、ファイル名の最後の数文字を取り、それらを逆にして、そこから 1 文字のディレクトリを作成することです。たとえば、次のファイルを考えてみましょう。

1.xml
24.xml
12331.xml
2304252.xml

次のようにディレクトリに並べ替えることができます。

data/1.xml
data/24.xml
data/1/3/3/12331.xml
data/2/5/2/4/0/2304252.xml

このスキームにより、各ディレクトリに 100 個を超えるファイルが存在しないことが保証されます。

于 2008-09-22T16:41:30.583 に答える
3

一般的なトリックの 1 つは、いくつかのサブディレクトリを作成し、ファイルを分割することです。

たとえば、大量の html ページを生成できる自動化されたコード ドキュメント プログラムである Doxygen には、2 レベルの深いディレクトリ階層を作成するためのオプションがあります。その後、ファイルは下位ディレクトリに均等に分散されます。

于 2008-09-22T16:29:06.450 に答える
2

ファイルをサブディレクトリに配置する以外に..

個人的には、そのフォルダーへのインターフェイスを同じに保つアプリケーションを開発します。つまり、すべてのファイルが個別のファイルとして表示されます。次に、アプリケーションのバックグラウンドで実際にこれらのファイルを取得し、それらをより大きなファイルに結合します (サイズは常に 64k であるため、必要なデータを取得するのは比較的簡単なはずです)。

そのため、ユーザーが必要なファイルに簡単にアクセスできるようにするだけでなく、すべての構造をより詳細に制御することもできます。

于 2008-09-22T16:30:49.877 に答える
1

大量の小さなファイルに適したファイルシステムを使用する別のサーバーにそれらをプッシュすることを検討してください (たとえば、Solaris w/ZFS)。

于 2008-09-22T16:27:40.133 に答える
1

データに意味のあるカテゴリ的な側面がある場合は、それらをディレクトリ ツリーに入れ子にすることができます。スローダウンは、ファイル自体の数ではなく、1 つのディレクトリ内のファイルの数によるものだと思います。

最も明白な一般的なグループ化は日付によるもので、各リーフ ディレクトリ内のファイル数 (1 ~ 3k) に比較的安全な制限がある 3 層の入れ子構造 (年、月、日) を提供します。

ファイルシステム/ファイル ブラウザのパフォーマンスを改善できたとしても、これは 2 年後、または 3 年後に発生する問題のように思えます... 0.3 ~ 1mil ファイルのリストを見るだけで、コストがかかるため、長期的には、ファイルの小さなサブセットのみを確認する方法を見つける方がよい場合があります。

'find' (cygwin または mingw の下) などのツールを使用すると、ファイルを参照するときにサブディレクトリ ツリーの存在が問題にならないようにすることができます。

于 2008-09-22T16:31:50.873 に答える
1

タイム スタンプを付けて、フォルダーの名前を毎日変更します。

アプリケーションがファイルを c:\Readings に保存している場合は、午前 0 時に Reading の名前を変更し、新しい空のフォルダーを作成するようにスケジュールされたタスクを設定します。

その後、毎日 1 つのフォルダーが作成され、それぞれに数千のファイルが含まれます。

この方法をさらに拡張して、月ごとにグループ化できます。たとえば、C:\Reading は c:\Archive\September\22 になります。

製品の保存中にフォルダの名前を変更しようとしないように、タイミングに注意する必要があります。

于 2008-09-22T16:37:09.143 に答える