1

我正在尝试在辅助存储器(硬盘)上构建四叉树数据结构(或者我们只是说一棵树)。

我有一个 C++ 程序可以这样做,我使用 fopen 来创建文件。此外,我正在使用 tesseral 编码将每个单元格存储在一个文件中,该文件以其相应的代码命名,以将其存储在磁盘上的一个目录中。

问题是在创建大约 1,100 个文件后,fopen 只返回 NULL 并停止创建新文件。我可以在该目录中手动创建更多文件,但使用 C++ 无法创建任何其他文件。

我知道 ext3 文件系统上 inode 的最大限制是(来自 Wikipedia)32,000,但我的要少得多,还要注意我可以在磁盘上手动创建文件;只是没有通过 fopen。

另外,我真的很感激关于在磁盘上存储一个非常动态的四叉树的最佳方法的任何想法(我需要将节点放在单独的文件中,并且四叉树的深度可能为 50)。

使用嵌套目录是一种想法,但我认为它会降低性能,因为遵循文件系统上的链接来访问文件。

谢谢,尼玛

4

4 回答 4

1

失败的 fopen() 调用的 errno 值是多少?

您是否将创建的文件保持打开状态?如果是,您很可能超过了每个进程的最大打开文件数。

于 2010-04-15T18:50:15.493 回答
0

当您使用目录作为数据结构时,您将维护该结构的工作委托给文件系统,而文件系统不一定是为此而设计的。

编辑:弗兰克可能是对的,您已经超出了可用文件描述符的数量。您可以增加这些,但这表明您也在使用 ABI 的内部作为数据结构。缓慢且(随着资源耗尽)不稳定。

为非常特定的操作系统安装编写代码,或者使用 SQL 数据库。

于 2010-04-15T18:51:02.227 回答
0

我不知道为什么fopen不工作。看errno

但是,将所有内容存储在一个目录中是一个坏主意。当您添加大量文件时,它会变慢。树的每一层都有一个目录也会很慢。

相反,将多个级别组合到一个目录中。例如,您可以为树的每四个级别创建一个目录。这将限制目录数量、嵌套数量和每个目录的文件数量,从而提供非常好的性能。

于 2010-04-15T18:55:05.660 回答
0

限制可能来自:

  • 标准输入输出(C 库)。最多 256 个句柄。可以增加到1024(在VC中,调用_setmaxstdio)
  • 文件上的操作系统内核处理每个进程(通常为 1024)。
于 2010-04-15T19:43:08.543 回答