Из базовой реализации Quadtree - PullRequest
0 голосов
/ 15 апреля 2010

Я пытаюсь построить структуру данных Quadtree (или, скажем так, дерево) на вторичной памяти (жесткий диск).

У меня есть программа на C ++, и я использую fopen для создания файлов. Кроме того, я использую тессеральное кодирование для хранения каждой ячейки в файле с соответствующим кодом для сохранения ее на диске в одном каталоге.

Проблема в том, что после создания около 1100 файлов fopen просто возвращает NULL и прекращает создание новых файлов. Я могу создавать дополнительные файлы вручную в этом каталоге, но с помощью C ++ он не может создавать дополнительные файлы.

Я знаю о максимальном предельном значении inode для файловой системы ext3, которое составляет (из Википедии) 32 000, но у меня это намного меньше, также обратите внимание, что я могу создавать файлы вручную на диске; только не через fopen.

Кроме того, я действительно ценю любую идею относительно лучшего способа хранения очень динамического дерева квадрантов на диске (мне нужно, чтобы узлы были в отдельных файлах, а глубина дерева дерева могла составлять 50).

Использование вложенных каталогов - одна из идей, но я думаю, что это снизит производительность из-за перехода по ссылкам в файловой системе для доступа к файлу.

Спасибо, Нима

Ответы [ 4 ]

1 голос
/ 15 апреля 2010

Каково значение errno неудачного вызова fopen ()?

Сохраняете ли вы созданные файлы открытыми? Если да, то вы, скорее всего, превышаете максимальное количество открытых файлов на процесс.

0 голосов
/ 15 апреля 2010

Ограничение может исходить от:

  • stdio (библиотека C). большинство 256 ручек. Может быть увеличено до 1024 (в VC, вызовите _setmaxstdio)
  • ядро ​​ОС на файл hanldes для процесса (обычно 1024).
0 голосов
/ 15 апреля 2010

Понятия не имею, почему fopen не сработает. Посмотрите на errno.

Однако хранить все в одном каталоге - плохая идея. Когда вы добавите много файлов, это будет медленно. Наличие каталога для каждого уровня дерева также будет медленным.

Вместо этого объедините несколько уровней в один каталог. Например, вы можете иметь один каталог для каждых четырех уровней дерева. Это ограничит количество каталогов, количество вложений и количество файлов в каталоге, что даст очень хорошую производительность.

0 голосов
/ 15 апреля 2010

Когда вы используете каталоги в качестве структур данных, вы делегируете работу по поддержке этой структуры файловой системе, которая не обязательно предназначена для этого.

Редактировать: Фрэнк, вероятно, прав, что вы превысили количество доступных файловых дескрипторов. Вы можете увеличить их, но это показывает, что вы также используете внутренние компоненты вашего ABI в качестве структуры данных. Медленно и (по мере исчерпания ресурсов) нестабильно.

Либо используйте код для очень конкретной установки ОС, либо используйте базу данных SQL.

...