Как дисковые указатели работают?

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

Таким образом, что правильный путь состоит в том, чтобы сохранить указатели на диске? Действительно ли ответ так же прост как (Файл, Смещение), или является там чем-то, что я пропускаю? Я могу постигнуть интуитивно, как указатели могли бы быть преобразованы в (Файл, смещены), пары, и назад снова, но есть ли некоторая тонкость, которую я должен не упустить?

Править: Я должен упомянуть, что особенно интересуюсь тем, как база данных сделала бы это внутренне для B-дерева. Я, вероятно, сделал вопрос более общим, чем я должен иметь, хотя я действительно ценю основанные на XML ответы.

6
задан Rob Lachlan 10 January 2010 в 18:12
поделиться

5 ответов

Если у вас есть инструменты для создания XHTML, как у любого другого XML-документа, то используйте XHTML. Но когда вы просто используете шаблоны обычного текста, конкатенацию текста и т.д., вы в порядке со старым хорошим HTML 4.01.

Теперь браузеры поддерживают этот 10-летний стандарт.

Важно: При создании XML

-121--2128380-

не следует делать ничего особенного для последовательности. Последовательности Perl по умолчанию UTF-8, начиная с Perl 5.8.

perl -CO -le 'print "\x{2603}"' | xargs perl -le 'print "I saw @ARGV"'

Вышеприведенный код отлично работает на Ubuntu 9.04, OS X 10.6 и FreeBSD 7.

Мы видим определенную разницу между

perl -Mutf8 -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a

и

perl -Mutf8 -CA -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a
-121--2307582-

Ваша интуиция о (файл, смещение) парах верна.

При хранении данных на дисках важно следить за тем, чтобы диски были медленными. Таким образом, существуют специальные структуры данных, предназначенные для хранения данных «с возможностью поиска» на дисках. Доступ к узлам двоичного дерева поиска, хранящимся на дисках с помощью указателя (файл, смещение), будет на порядки медленнее, чем доступ к ним в памяти.

Если важна скорость доступа, вы бы хотели хранить вещи, доступ к которым ожидается совместно, ближе друг к другу на дисках. Для этого используются две структуры данных: B-дерево и B + дерево . Посмотрите на них, чтобы узнать, как их использовать. Существуют сложные алгоритмы кэширования , используемые несколькими приложениями, такими как базы данных, для кэширования вещей в памяти, так что приложениям не нужно переходить на диск, чтобы извлекать вещи снова и снова.

Если скорость доступа не важна, то достаточно просто «сериализовать» данные на диске в виде XML, как предложили Эйден и Даррен.

Edit: Если вам нужна дополнительная информация о том, как базы данных хранят данные на диске, вам нужно будет узнать больше о теории баз данных. Я бы предложил прочитать хорошую книгу по базам данных, чтобы вы поняли требования, определяющие формат диска. Заметим, что я в основном имею в виду реляционные базы данных , но существуют другие породы из баз данных , которые имеют совершенно различные требования и, следовательно, различные форматы дисков. Начать с реляционных баз данных хорошо, хотя, поскольку они наиболее часто используются.

Одним из факторов, влияющих на формат диска реляционной базы данных, является:

  1. Производительность чтения/записи на диске
  2. Восстановление базы данных (в случае повреждения)
  3. Отношения между сущностями
  4. Сбор мусора
  5. Поддержка транзакций
  6. Первичный индекс

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

4
ответ дан 17 December 2019 в 00:10
поделиться

Можно ли искать в вашем дереве памяти? Звучит как обычная java-задача отправки объекта по сети. Объекты имеют ссылки на другие вещи, но адрес указателя будет меняться один раз из адресного пространства программы. Не могли бы вы сериализовать ваше дерево в XML или JSON форму?

.
0
ответ дан 17 December 2019 в 00:10
поделиться

То же самое, что и ADAM Rosenfield Action (+1), но я использую UTFCPP вместо этого.

-121--2221456-

Точно так же, как значение указателей будет бессмысленным.

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

Например, вот как можно сохранить ваши данные:

 
 [Мета-данные] [Данные] 

[META-DATA] = [Длина] [Список вложенных набор-моделей] [Список данных-записей] = [LFT- # 1] [RGT- # 1] [LFT- # 2] [RGT- # 2] ... [Данные] = [Длина] [Полезная нагрузка / сама данных]

Это только пример, и использование JSON (рекомендуется) или XML, может быть, лучше и проще.

1
ответ дан 17 December 2019 в 00:10
поделиться

Модуль F # SEQ Определяет парапрерывную функцию в течение Ienumerable , но эта функция не находится в .NET Framework.

Если он уже был в .NET Framework, вместо того, чтобы возвращать пары, это, вероятно, примет функцию селектора из-за отсутствия поддержки кортежей на языках, таких как C # и VB.

var pairs = ns.Pairwise( (a, b) => new { First = a, Second = b };

Я не думаю, что какая-либо из ответов здесь действительно улучшается по вашему простую реализацию итератора, что казалось большинством естественным для меня (и плакат Dahlbyk !) тоже.

-121--1098383-

Двоичный или текст - это первый вопрос

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

XML был создан как портативный способ сохранить и обменными структурированными данными.

Если бы это был я, я бы использовал XML-подобное, но менее неуклюжему ямлу.

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

Большинство языков уже имеют библиотеки сериализации; Я уверен, что есть какая-то библиотека Boost для C. Обычно существует несколько интерфейсов сериализации, использующих разные представления.

Если вы используете библиотеку, XML или YAML, ссылки будут неявной в структуре для дерева. Если ваши данные имеют более общий график, то Используете ли вы текст или двоичный доступ, вам может придеться нормализовать ссылки. Это задача указателя, которую вы упомянули. Один из способов разрешить это было бы сохранить временные карты, которые используются при чтении или записи файла. То есть вы просто назваете все целевые ссылки, скажем, A1, A2, A3 ... а затем используйте его как тег в пункте назначения и в качестве имени ссылки (думаю, что href =) на источнике.

Я бы не использовал файловые смещения в качестве указателей, он просто кажется слишком хрупким и, естественно, имеет смысл использовать XML или YAML или что-то еще, что уже существует.

1
ответ дан 17 December 2019 в 00:10
поделиться

Изменение ответа Фредди при использовании MVC - пришлось использовать:

HttpContext.User.Identity.Name

Незначительное изменение, но я подумал, что опубликую его в случае, если кто-то еще попытается сделать это в MVC попадет в ту же загвоздку.

-121--2890584-

Обратные итераторы имеют члена base () , который возвращает соответствующий прямой итератор. Обратите внимание, что не является итератором, который ссылается на один и тот же объект - он фактически ссылается на следующий объект в последовательности. Это так, что rbegin () соответствует end () и rend () соответствует begin () .

Так что если вы хотите вернуть итератор, то вы бы сделали что-то вроде

std::deque<Move>::const_iterator Current() const
{
    if (forward)
        return currentfwd;
    else
        return (currentbck+1).base();
}

Я бы предпочел вернуть ссылку, хотя, и инкапсулировать все итерационные детали внутри класса.

-121--1141566-

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

Предоставление:

  1. Узлы содержат ссылки на сохраняющиеся расположения
  2. При написании узла можно знать, какие расположения следует записать

Это можно сделать любым способом. Файловые системы - это деревья , использующие дисковую систему inode.

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

Также можно использовать XML-файлы с ссылки на другие расположения или один файл и XPath/XPointers .

<Node id="someNode">
    <value>...</value>
    <children>
        <child xpath="/node[id=1]" />
        <child xpath="/node[id=29]" />

Но это будет означать сериализацию ваших значений на символы, если они являются просто двоичными blobs (eww) Ваше значение может быть путь двоичного блока только что записан в файл, как:

<value>/path/to/mappable.bin</value>

Извлечь все от инкапсуляции XML до файловых систем, написанных в C для целая гамма реализаций дерева.

Это решение XML может быть раздутым , но достаточно простым, если вам не нужна скорость. Просто пример подхода высокого уровня. Место хранения - это вековая проблема с решениями на всех уровнях.

Деревья - это деревья.

1
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: