【问题标题】:Out of Core Implementation of a Quadtree四叉树的核心实现
【发布时间】:2011-02-08 12:54:06
【问题描述】:

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

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

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

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

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

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

谢谢, 尼玛

【问题讨论】:

    标签: c++ tree operating-system filesystems inode


    【解决方案1】:

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

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

    【讨论】:

    • fopen 返回 NULL。哦,是的……你是对的。我没有注意到这一点。我让它们保持开放。谢谢。
    【解决方案2】:

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

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

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

    【讨论】:

    • SQL 数据库也将是一个糟糕的主意。最好的选择是针对此类工作优化的文件系统(我不知道),或者键值存储。
    • @Zifre:键值存储是 SQL 数据库的基本应用之一。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      限制可能来自:

      • stdio(C 库)。最多 256 个句柄。可以增加到1024(在VC中,调用_setmaxstdio)
      • 文件上的操作系统内核处理每个进程(通常为 1024)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        相关资源
        最近更新 更多