1

セカンダリ メモリ (ハードディスク) にクアッドツリー データ構造 (または単にツリーと言いましょう) を構築しようとしています。

そのための C++ プログラムがあり、fopen を使用してファイルを作成します。また、テッセラルコーディングを使用して、各セルを対応するコードで名前が付けられたファイルに保存し、ディスク上の1つのディレクトリに保存しています。

問題は、約 1,100 個のファイルを作成した後、fopen が NULL を返すだけで、新しいファイルの作成を停止することです。そのディレクトリに追加のファイルを手動で作成できますが、C++ を使用すると、それ以上のファイルを作成できません。

(ウィキペディアから) 32,000 である ext3 ファイルシステムの inode の最大制限については知っていますが、私のものはそれよりもはるかに少なく、ディスク上に手動でファイルを作成できることにも注意してください。fopenを介していないだけです。

また、非常に動的な四分木をディスクに保存する最良の方法に関するアイデアを本当に感謝しています(ノードを別々のファイルに配置する必要があり、四分木の深さは50である可能性があります)。

ネストされたディレクトリを使用することも 1 つのアイデアですが、ファイル システム上のリンクをたどってファイルにアクセスするため、パフォーマンスが低下すると思います。

ありがとう、ニマ

4

4 に答える 4

1

失敗した fopen() 呼び出しの errno 値は?

作成したファイルを開いたままにしますか? はいの場合、プロセスごとに開いているファイルの最大数を超えている可能性があります。

于 2010-04-15T18:50:15.493 に答える
0

制限は、次の場合に発生する可能性があります。

  • stdio (C ライブラリ)。ほとんどの 256 ハンドル。1024 まで増やすことができます (VC では、_setmaxstdio を呼び出します)
  • ファイル上の OS カーネルは、プロセスごとにハンドルされます (通常は 1024)。
于 2010-04-15T19:43:08.543 に答える
0

ディレクトリをデータ構造として使用すると、その構造を維持する作業をファイル システムに委任することになりますが、ファイル システムは必ずしもそのように設計されているわけではありません。

編集: 使用可能なファイル記述子の数を超えたというフランクの意見はおそらく正しいでしょう。それらを増やすことはできますが、それは ABI の内部もデータ構造として使用していることを示しています。遅く、(リソースが使い果たされるため) 不安定です。

非常に特定の OS インストール用にコーディングするか、SQL データベースを使用します。

于 2010-04-15T18:51:02.227 に答える
0

うまくいかない理由fopenがわかりません。を見てくださいerrno

ただし、すべてを 1 つのディレクトリに格納することはお勧めできません。多くのファイルを追加すると、遅くなります。ツリーのすべてのレベルのディレクトリを持つことも遅くなります。

代わりに、複数のレベルを 1 つのディレクトリに結合します。たとえば、ツリーの 4 レベルごとに 1 つのディレクトリを持つことができます。これにより、ディレクトリの数、ネストの量、およびディレクトリごとのファイルの数が制限され、非常に優れたパフォーマンスが得られます。

于 2010-04-15T18:55:05.660 に答える