Проблема производительности сериализации массива - PullRequest
0 голосов
/ 01 октября 2010

В моем приложении Windows Mobile (.NET Compact Framework) я использую большой массив для хранения первичных данных приложения. Это набор данных из потенциально сотен объектов. Каждый объект имеет около 10 или около того свойств и два массива, каждый из которых содержит около 25 других объектов, каждый из которых имеет около 5 свойств.

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

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

Фактическая проблема заключается в том, что при сохранении всего массива в основном изменилась только пара объектов. Итак, основной поток выглядит примерно так:

  • Загрузить весь массив из хранилища, скажем, 400 объектов;
  • Изменить несколько свойств 1 объекта;
  • Сохранить весь массив обратно в хранилище, все 400 объектов;
  • Изменить еще пару свойств этого же объекта;
  • Сохранить еще раз
  • Изменить конечные свойства;
  • Сохранить еще раз;
  • То же самое с любыми последующими объектами ...

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

Как я могу решить это?

1 Ответ

1 голос
/ 01 октября 2010

Итак, чтобы быть ясным, не убедитесь, что я понимаю ваш сценарий:

  • У вас есть некая форма сериализованного массива (вы не указали формат как XML, двоичный или другой) как ваше хранилище данных?
  • И если одно свойство изменяется, вы переписываете весь массив, даже если есть 1000 объектов с подобъектами?
  • И вы пишете во Flash, а не только в RAM?
  • А для полного "сохранения" вы несколько раз выполнили операцию записи?
  • И по какой-то причине вы обнаруживаете, что это медленно и чем медленнее становится набор данных?

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

Вы должны использовать реальный механизм базы данных, будь то СУБД или объектная база данных,но что-то, что делает путь, намного меньше записи на носитель.Если вам нужны данные в виде массива для передачи на ПК / сервер, это нормально - создайте механизм извлечения из хранилища и поместите его в массив для этой цели.

...