Лучшие практики для пользовательских файловых структур

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

Например, если вы создали свое собственное программное обеспечение для какой-либо цели, вы оставляете сохраненные данные в виде простого текста, сериализуете их, кодируете в xml и зачем вы это делаете?

Есть ли секреты, которые я пропустил?


person Andy    schedule 01.03.2009    source источник


Ответы (7)


Как правило, выбирайте самое простое, что может сработать, по крайней мере, поначалу. Возьмем, например, UNIX, где большинство файлов конфигурации представляют собой не что иное, как поля, разделенные пробелами, или поля, разделенные другим символом (например, /etc/passwd, в котором используются разделители «:», поскольку поле GCOS может содержать пробелы).

Если ваши данные нуждаются в гораздо большей структуре, спросите себя: «Какие инструменты я могу легко использовать?» Например, в Python и Ruby есть JSON и YAML.

XML в основном полезен, если у вас уже есть много материалов на основе XML ИЛИ вы хотите преобразовать XML в отображаемую форму в браузере. В противном случае он обычно очень тяжеловесен (размер кода, сложность) для того, что вы получаете от него.

person Charlie Martin    schedule 01.03.2009
comment
Я согласен. Я также говорю, подумайте о том, что может повлечь за собой будущее для вашей структуры данных. Убедитесь, что формат вашего файла можно легко расширить, если, например, к вашим данным будет добавлено новое поле. - person Kevin Lacquement; 02.03.2009

Независимо от того, какой формат вы выберете, не забудьте сохранить внутри какой-то номер версии (я почти уверен, что вам придется внести некоторые изменения).

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

Я использую много разных форматов, в зависимости от ситуации, например:

  • обычный текстовый файл (с разделителями) для хранения наборов данных для анализа Matlab и R
  • бинарные файлы - для хранения структур фиксированного размера (с динамическим размером произвольный доступ затрудняется без сохранения отдельного массива смещений для элементов). Одним из положительных моментов является производительность и эффективность использования пространства (почему большинство баз данных хранят данные в двоичном формате?), но это не очень удобно для работы людей. Помните о порядковом порядке.
  • XML — обычно для данных конфигурации или данных, которые я хочу предоставить другим пользователям приложений (вместе с XSD). Другая сторона может написать красивое преобразование XSLT или использовать данные другим способом (конечно, они могут сделать то же самое с обычным текстом или двоичными данными с учетом описания формата).
person Anonymous    schedule 01.03.2009

Если у вас нет уникальных требований, используйте то, для чего уже есть зрелая библиотека, чтобы избежать написания собственного кода синтаксического анализа. Это означает XML/JSON и т. д., как говорили люди.

Еще один приятный момент — буферы протокола Google (http://code.google.com/p/protobuf). Там вы пишете общее определение сообщения, а компилятор буфера протокола генерирует объекты для заполнения, сериализации и десериализации данных для вас. Обычно это двоичный формат, но вы также можете использовать их класс TextFormat для написания простого текста, похожего на JSON. Прелесть protobufs в том, что код управления версиями создается за вас. В версии 2 вашего формата файла все, что вам нужно сделать, это добавить поля в файл определения .proto. Новая версия может читать старый формат файла и просто оставляет новые поля пустыми. Это не совсем то, для чего были разработаны protobuf, но они создают простой и эффективный формат двоичных файлов для пользовательских сообщений, а код генерируется для вас.

Также см. Facebook Thrift, теперь в инкубаторе Apache.

person Kevin Weil    schedule 01.03.2009

Шли годы, и я обнаруживал, что все больше и больше предпочитаю текст, если только это не исключено. ЦП достаточно быстр, чтобы мы могли декодировать его достаточно быстро.

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

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

person Loren Pechtel    schedule 01.03.2009

+1 за XML. Имеет немного накладных расходов, но легко анализируется, читается и отлаживается. Может быть строгим, если вы используете схему. Легко трансформируется с помощью XSLT и очень портативный (по проводу или просто на флешке :)

person boj    schedule 01.03.2009

Это действительно зависит от конкретной ситуации. Вам нужно будет рассмотреть ваши варианты ответов на различные вопросы:

  • Сколько данных вам нужно хранить? Вам нужно оптимизировать для компактного представления?
  • Критична ли производительность операций чтения/записи? Вам нужно оптимизировать доступ к диску и сериализацию и десериализацию с низким уровнем воздействия?
  • Вам нужен произвольный доступ внутри файла? Вам нужно оптимизировать структуру для поиска в данных?
  • Будут ли эти данные использоваться в разных системах, возможно, с разными кодировками символов? Вам нужна оптимизация для переносимости?

Влияние будет иметь характер самих данных. Это плоская структура списка? Это дерево? Это циклический граф? Записи имеют фиксированную или переменную ширину?

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

person Drew Noakes    schedule 01.03.2009

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

  • Практически для каждой платформы разработки есть достойные XML-библиотеки.
  • Большинство платформ позволяют сериализовать объектный граф с помощью пары строк кода, поэтому реализовать XML несложно.
  • На большинстве платформ есть встроенный в память и/или потоковый ридер, поэтому вы можете работать с действительно большими файлами без чрезмерного использования памяти.
  • Большинство платформ предоставляют преобразователь XSLT, поэтому вы можете перемещать файлы из одного формата в другой, даже из XML в не XML.
  • Есть расширение индексации для XML, чтобы обрабатывать действительно большие файлы.
  • XML имеет XSD для проверки формата, прежде чем вы попытаетесь его прочитать.
  • XML может представлять любой простой или сложный объект.
  • Если вас беспокоит размер файла, просто заархивируйте окончательный XML. Этот метод используется в Microsoft Office и т. д.
  • XML по-прежнему читается человеком
  • XML является общепринятым стандартом
person TFD    schedule 02.03.2009