Хранение глубокого дерева каталогов в базе данных - PullRequest
0 голосов
/ 15 октября 2018

Я работаю над настольным приложением, которое очень похоже на WinDirStat или voidtools 'Everything - оно отображает жесткие диски, то есть создает глубоко вложенный словарь из дерева каталогов.

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

Предположим, что оба приложения в данный момент работают локально на одном компьютере.

Возникает вопрос: как следует структурировать данные и какую базу данных использовать, учитывая: 1) потребление ОЗУ должно быть разумным; 2) время, необходимое для готовности каталога к просмотру ввеб-приложение должно быть минимальным

PS - Мой первоначальный подход заключался в сериализации каждого узла файловой системы в JSON отдельно и вставке каждого в Mongo со ссылками на объекты, связывающими их с их дочерними элементами.Таким образом, веб-приложение может легко загружать данные в зависимости от потребностей пользователя.Однако я обеспокоен тем, что создание стольких (в среднем, миллиона) независимых вставок в Mongo займет много времени;если я делаю массовые вставки, это означает, что я должен хранить каждую большую часть в памяти.

Я также рассмотрел дамп всего дерева как одного глубоко вложенного JSON, но данные слишком велики, чтобы быть документом Mongo.GridFS может использоваться для его хранения, но тогда мне придется загрузить все дерево в веб-приложение, даже если глубокие узлы могут не представлять интереса.

1 Ответ

0 голосов
/ 23 октября 2018

С учетом ваших требований:

  • A) Низкое использование ОЗУ
  • B) Соответствие ограничениям размера файла в Mongo
  • C) Отзывчивый пользовательский интерфейс

Я хотел бы рассмотреть что-то вроде следующего:

Возьмите этот пример каталога

C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js

В JSON это может быть представлено как:

{
    "C:" : {
        "X" : {
            "B" : { },
            "file.txt" : "C:\X\file.txt",
        },
        "Y" : {
            "file.pdf" : "C:\Y\file.pdf",
            "R" : {
                "file.js" : "C:\Y\R\file.js",
            }
        }
    }
}

Последний, как вы указали, плохо масштабируется при больших структурах каталогов (я могу вам сказать, что браузеры не оценят BLOB-объект JSON, представляющий даже скромный каталог с несколькими тысячами файлов / папок).Первый, хотя и сродни некоторым реальным файловым системам и эффективен в правильном контексте, является трудной задачей для преобразования в и из JSON.

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

Приведенная выше структура может быть разбита на следующие документы:

{
    "id" : "CCCCCCCC",
    "type" : "p",
    "name" : "C:",
    "children" : [
        { "name" : "X", "type" : "p", "id" : "XXXXXXXX" },
        { "name" : "Y", "type" : "p", "id" : "YYYYYYYY" }
    ]
}

{
    "id" : "XXXXXXXX",
    "type" : "p",
    "name" : "X",
    "children" : [
        { "name" : "B", "type" : "p", "id" : "BBBBBBBB" },
        { "name" : "file.txt", "type" : "f", "path" : "C:\X\file.txt", "size" : "1024" }
    ]
}

{
    "id" : "YYYYYYYY",
    "type" : "p",
    "name" : "Y",
    "children" : [
        { "name" : "R", "type" : "p", "id" : "RRRRRRRR" },
        { "name" : "file.pdf", "type" : "f", "path" : "C:\Y\file.pdf", "size" : "2048" }
    ]
}

{
    "id" : "BBBBBBBB",
    "type" : "p",
    "name" : "B",
    "children" : [ ]
}

{
    "id" : "RRRRRRRR",
    "type" : "p",
    "name" : "R",
    "children" : [
        { "name" : "file.js", "type" : "f", "path" : "C:\Y\R\file.js", "size" : "2048" }
    ]
}

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

ОБНОВЛЕНИЕ 1 : я как-то пропустил вашеВторой последний абзац, прежде чем ответить, так что это, вероятно, более или менее то, что вы имели в виду.Для решения проблемы слишком большого количества документов может быть необходим некоторый уровень узлов кластеризации в документах.Мне нужно сейчас уйти, но я подумаю над этим.

ОБНОВЛЕНИЕ 2 : Я создал суть упрощенной версии упомянутой концепции кластеризации.Он не учитывает файлы, только папки, и он не включает в себя и код для обновления документов.Надеюсь, это даст вам некоторые идеи, я буду продолжать обновлять его для своих собственных целей.

Суть: tree_docs_cluster.js

...