Проблема со скоростью сохранения / загрузки расширенного текста в C #

В настоящее время я пытаюсь решить проблему скорости, связанную с загрузкой и сохранением Richtext. Вот подробности. В моем приложении у меня есть класс Question, который должен иметь возможность хранить два richtexts. В настоящий момент эти два richtexts хранятся в классе Question как TextRanges. Что касается сохранения / загрузки, я использую TextRange.Load (Stream, DataFormats) и TextRange.Save (Stream, DataFormats). Все работает...

Моя проблема в том, что мне нужно иметь 1000+ этих вопросов для сохранения / загрузки из файла. Когда я делаю это, сохранение / загрузка файла, содержащего эти вопросы, занимает 20 секунд. И вдобавок ко всему, я хотел бы иметь возможность загружать сразу несколько из этих файлов ... что заставило бы пользователя ждать, возможно, несколько минут. Я уверен, что теперь моя проблема ясна.

Итак, я начал исследовать, почему сохранение / загрузка файла занимает так много времени, и с помощью профилировщика я обнаружил, что 80% времени, затрачиваемого на сохранение / загрузку файла, приходится на методы TextRange.Load и TextRange.Save.

Итак, мой вопрос ... Есть ли у кого-нибудь предложения или указания по ускорению сохранения / загрузки файла?

Я пытался придумать другой способ сохранить Richtext как в классе Question, так и в файле. У меня довольно быстро закончились идеи, но я хотел приехать сюда, прежде чем уступил. Любая помощь приветствуется. Также дайте мне знать, если мне нужно что-то уточнить. Спасибо!


person Jasson    schedule 18.04.2009    source источник


Ответы (2)


Сколько накладных расходов возникает при каждом вызове Load и Save, есть ли какое-то преимущество в вызове Load один раз для большого диапазона по сравнению с многократным вызовом для небольших диапазонов? Сколько раз вы вызываете Load при загрузке +1000 вопросов? При каждом действии вызова Load обновляется где-то RichTextBox или Flow Document? Если нет, что вы делаете с TextRanges после их загрузки?

Я заметил этот связанный поток и подумал, что предлагаю предложение: что, если вы сохраните массивы байтов (или потоки памяти) в классе Question вместо TextRange и создадите TextRange только тогда, когда вам действительно нужно загрузить данные в RichTextBox (когда открывается окно для вопроса)?

person MichaC    schedule 18.04.2009
comment
Теперь, когда вы упомянули об этом, в методах TextRange.Save и Load возникает приличная нагрузка. На самом деле я звоню в Load дважды для каждого вопроса. Таким образом, на 1000 вопросов он вызывается 2000 раз. Существует FlowDocument, используемый в течение секунды для загрузки форматированного текста, однако, согласно профилировщику, он не использует много ресурсов ЦП. Я разрешаю пользователю открывать эти вопросы, и тогда открывается окно с RichTextBoxes, которые заполняются этими TextRanges. - person Jasson; 18.04.2009
comment
Я думаю, что могу попытаться объединить TextRanges в один большой для Save и Load, а затем проанализировать его. Я уверен, что это хоть немного ускорит его. Спасибо за идею. ^^ - person Jasson; 18.04.2009
comment
Гениальная идея! Я не думал, что было бы хорошо открыть несколько тысяч потоков, и не хотел связываться с тем, чтобы каждый раз, когда я хотел их прочитать, удостоверился, что они находятся в самом начале. Поэтому я изменил TextRanges на byte []. Мне пришлось изменить кучу вещей, но как только я закончил, я запустил его, и мой код работал примерно в 10 раз быстрее, lol, но все равно потребовалось время, чтобы загрузить файл. Используя профилировщик, я смог еще больше его ускорить. Теперь он загружает файл примерно за полсекунды! Спасибо! : D - person Jasson; 19.04.2009

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

person Kredns    schedule 18.04.2009
comment
Раньше я экспериментировал с этой идеей. Я бы не стал делать это именно так, поскольку мне нужно загрузить весь файл, чтобы пользователь мог что-либо делать с вопросами; однако я мог бы использовать потоки, чтобы пользователь мог что-то делать с уже загруженными файлами. - person Jasson; 18.04.2009