Вопрос

У меня есть некоторые файлы данных, которые записываются как tag = значение, где тег является строкой, а значение может быть числовым, строка, массив и т. Д. Я использую этот формат, потому что его читаемо и может быть отредактировано. Теперь каждый класс, который создается с использованием этого формата, имеет метод загрузки, и он читает теги, которые ему нужны, и использует значения, найденные в этих тегах. Я хочу сделать бинарные данные для увеличения скорости нагрузки. Одним из способов было бы иметь метод Tobinary (имя не имеет значения) в каждом классе, который считывает старые данные и записывает их в файле, а новый файл используется для создания объекта. Это можно сделать в автономном режиме, только один раз/приложение. У вас есть другие предложения для этого? Я использую C ++ для этого.

РЕДАКТИРОВАТЬ: Я думаю, что сейчас самая дорогая часть - проанализировать файл, когда я впервые прочитал его, и после этого для поиска тега, который мне нужен, не для чтения файла с диска. Я могу использовать пользовательскую файловую систему, чтобы иметь несколько небольших файлов в одном большом файле.

Это было полезно?

Решение

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

Что-то вроде этого:

class SeralizeMe
{
public:

 virtual bool To(Archive &file)=0;
 virtual bool From(Archive &file)=0;

 virtual bool NeedsSave(void)=0;

};

Однако не используйте эту систему, если вы:

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

Если какое -либо из вышеприведенного применимо, используйте базу данных, Firebirdsql Embedded является подходящим претендентом.

Другие советы

Я не использовал его раньше, но я уверен Модуль сериализации Boost это хорошее место для начала.

Если вы используете файл, то использование двоичных данных, вероятно, не улучшит ваши выступления, если у вас нет очень большой кусок данных для хранения в файле (Images, Videos ...).

Но в любом случае вы можете использовать алгоритм бинарной сериализации, например, из Способствовать росту.

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

Ссылка на сайт здесь.

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

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

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

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

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

Если вы не заботитесь о переносимости, посмотрите, имеет ли ваша платформа возможность DMA (DMA или компонент прямого доступа к памяти позволяет передавать данные без использования процессора или минимизировать использование процессора). Что -то, за что следует обратить внимание, это то, что многие платформы делятся адресной и шиной данных между процессором и DMA. Таким образом, один компонент блокируется или приостановлен, в то время как другой использует адресные и шины данных. Так что это может помочь или нет. Зависит от того, как платформа подключена.

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

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

Резюме

  1. Перевозить большие блоки данных в память.
  2. Профиль перед внесением изменений для установления базового измерения производительности.
  3. Оптимизируйте один шаг за раз, профилируя после каждой оптимизации.
  4. Предпочитаю сохранить файл данных в читаемой форме человека.
  5. Минимизируйте изменения в файле данных.
  6. Преобразовать файл для использования полей фиксированной длины.
  7. Попробуйте использовать потоки или многозадачность, чтобы приложение не ждало.
  8. Преобразовать текст в числовые токены (уменьшает читаемость человека)
  9. Преобразовать данные в бинарный в качестве последнего средства (очень трудно читать и отладить).

У меня есть две идеи для вас:

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

Например, учитывая следующее:

Tag1 = "hello World!" // 12 bytes in length (achieved by "strlen(value) * sizeof(char)" )
Tag2 = "hello canada!"  // 13 bytes in length 

Вы можете превратить это в байтовый поток:

0x0001 0x000B // followed by 12 bytes representing the 'value' // 0x0002 0x000C // followed by 13 bytes representing 'value2'

Ваша программа просто должна знать, что заголовок слова «0x0001» представляет TAG1, а заголовок «0x0002» представляет TAG2.

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

2) Возможно, медленный бит - это просто ваша реализация текстового анализа? Подумайте об использовании специальной библиотеки с открытым исходным кодом для того, что вы пытаетесь сделать. Пример: "Boost :: Property_tree"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top