2009-10-09 4 views
1

Я работаю над программой, которая читает из последовательного порта, затем анализирует, форматирует и отображает информацию соответствующим образом. Однако эта программа должна запускаться более 12 часов - постоянно обрабатывать поток входящих данных. Я нахожу, что, когда я позволяю моему приложению работать некоторое время, использование памяти увеличивается с линейной скоростью - не очень полезно для 12-часового использования.Чтение из SerialPort & Управление памятью - C#

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

Также есть ли другие аспекты приложения Windows Form, которые будут способствовать этому? Например. Я печатаю форматированные строки в текстовое поле, которое заканчивается отображением всей строки. Поскольку он работает так долго, он легко отображает сотни тысяч строк текста. Должен ли я писать это в файл и очищать текст? Или что-то другое?

ответ

2

Очевидно, что, если строка со временем растет, использование памяти вашего приложения также будет расти со временем. Кроме того, текстовые поля WinForms могут иметь проблемы с очень большими строками. Насколько велика строка?

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

+1

Спасибо большое! Фактический объект String имеет максимально 17 символов. Каждый раз, когда строка добавляется к дисплею, nulled (string = "";), устанавливается в новое значение и добавляется. Затем промыть и повторить. Так что фактическая строка не становится слишком большой, но отображение в текстовом поле связано с тем, что строка постоянно добавляется к текущему экрану. Это что-то меняет? – Slim

+0

Нет. Как часто обновляется строка? (Как долго появляется текстовое поле?) – SLaks

+0

Устройство - скорость передачи 9600 бод, постоянно отправляющая информацию.Я использую поток _dataReceived() для обработки входящих данных - я не уверен, насколько скоро вы узнаете, что это такое, давайте просто скажем, что это много и быстро. В течение нескольких минут я показываю ~ 25 тыс. Строк (каждый из 17 символов). Я сделал быстрый тест, где каждые 50 итераций (добавления строки 17char к дисплею) я очищаю дисплей. Это показало TREMENDOUS улучшения. В настоящее время он работает в течение 17 минут и едва увеличивает использование памяти в соответствии с taskmgr. Я думаю, проблема решена .. спасибо тонну. – Slim

1

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

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

+1

* * * * * полностью * автоматический, потому что GC не может собирать ссылки («внедренные») объекты, хотя они никогда не будут использоваться снова. –

+0

Спасибо за информацию - определенно помогает моему пониманию. Я обязательно изучу использование ListBox и, возможно, другое приложение для мониторинга использования mem. В настоящее время «стресс» тестирует приложение сейчас - я все же опасаюсь экстраполировать мои 10минутные тесты на 12 часов, как вы упомянули. Я надеюсь, что смогу получить хороший час или 2 дюйма и проверить результаты на что-то более точное. Еще раз спасибо. – Slim

0

У меня есть несколько последовательных приложений, которые запускаются либо как приложение, либо как служба Windows. Они должны быть 24/7-365. Лучший механизм, который я нашел, чтобы избежать этой же проблемы, в два раза.

1) Напишите информацию в файл журнала. Для службы это единственный способ получить информацию. Файл журнала не увеличивает использование вашей памяти.

2) Для приложения напишите информацию в файл журнала, а также поместите его в список. Я обычно ограничиваю список до последних 500 или 1000 записей. С новыми элементами управления .net виниловые списки виртуализируются, но вы также не запускаете другие проблемы с памятью, такие как конкатенация текстовых полей.

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