Вопрос

Обновить:Вероятно, я перепутал проблемы с использованием памяти с пользовательским интерфейсом, использующим тот же поток, что и обработка (как указано MusiGenesis ниже).Однако что касается использования памяти.Я все еще не могу найти VB.net конкретный синтаксис, хотя люди указали на некоторые замечательные .Информация о Net и C # приведена ниже (и если бы я был более сведущ в этих технологиях, можно было бы адаптироваться для работы с VB.net).

Я создаю VB.Сетевое приложение.

  • Приложение в основном анализирует данные Файлы, расположенные на клиентском компьютере в DataSet / DataTables.
  • Затем, используя DataView, он разбивает Таблицы данных на управляемые фрагменты, записывает в XML и отправляет XML-данные в веб-сервис.

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

При запуске, прежде чем что-либо делать, приложение VB имеет 27 000 K.Как только файл проанализирован, и даже после того, как я избавлюсь от дескриптора файла, а также от данных, их количество значительно увеличивается.Я удаляю все в коде, и по-прежнему кажется, что память при использовании Mem остается захваченной.Нет никакой рифмы или причины относительно того, почему использование Mem растет (т.е.иногда он может увеличиться на 20 мб при чтении файла размером 7 мб, однако в других случаях он вообще не увеличивается при чтении файла размером 3 мб).Иногда требуется освободить часть памяти после завершения синтаксического анализа, а в других случаях она просто сохраняется.

Я просмотрел профилировщик .Net Memory Profiler и на самом деле не смог сделать из этого выводы.
Я много читал в Интернете об управлении памятью в .Net в целом о Dispose и "Ничего", наборах данных и т.д., Однако на самом деле ничего не нашел относительно VB.Конкретно Net.

Мой общий вопрос заключается в следующем:Существуют ли какие-либо хорошие учебные пособия / книги / блоги / и т.д., Которые показывают более подробное руководство по управлению памятью в VB.Сетевое приложение (т. е.как / когда утилизировать / закрыть и т.д.), или у кого-нибудь есть какие-то конкретные советы из тамошнего опыта.

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

Решение

Во-первых, вы должны понимать, что Диспетчер задач показывает вам объем памяти, выделенный операционной системой вашему приложению.Это не обязательно тот объем памяти, который фактически используется.При первом запуске .NET-приложения операционная система выделяет для него память точно так же, как и для любого процесса.Затем среда выполнения .NET дополнительно разделяет эту память и управляет тем, как она используется.Среду выполнения можно считать "жадной" в том смысле, что после выделения операционной системой памяти она не вернет ее обратно, если только операционная система специально не попросит об этом.В результате использование памяти в диспетчере задач является неточным.

Чтобы получить правдивую картину использования вашей памяти, вам необходимо использовать Performance Monitor и добавить соответствующие счетчики.

Насколько IDisposable и шаблон dispose, вы, вероятно, не найдете многого, что говорит об этом в специфичных для языка терминах, поскольку это то, что предоставляется самой .NET Framework и не зависит от языка.Шаблон один и тот же, независимо от того, какой язык вы используете, отличается только синтаксис.

Доступно несколько ссылок, которые дадут вам информацию о том, как работает управление памятью.У меня есть два поста в блоге, в одном из которых говорится о Использование сборки мусора в .NET и тот, в котором перечислены различные Ресурсы Раньше я создавал две презентации по управлению памятью в .NET.

Лучшее "эмпирическое правило" заключается в том, что если класс реализует IDisposable, это делается по какой - то причине, и вы должны убедиться, что вы вызываете Dispose() когда вы закончите использовать экземпляр.Это проще всего сделать с помощью using заявление.

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

Управление памятью в VB.Net фактически обрабатывается .Net Framework, так что в целом в VB это то же самое.Net, что и в C #.Однако понимание того, как это работает, позволяет вам принимать лучшие программные решения - когда объявлять переменные, когда объекты удаляются, В этом контексте, я думаю, ваш вопрос можно сформулировать как "есть ли какие-нибудь хорошие источники, которые расскажут мне, как кодировать эффективно и с меньшим объемом памяти", ИЛИ "Может ли кто-нибудь сказать мне, почему происходят эти странные вещи".На оба вопроса можно ответить, дав более полное представление о том, как .Net управляет памятью, областью действия и т.д.Есть масса ресурсов, чтобы ответить на этот вопрос,

Тем не менее, в этой первой ссылке есть много других ссылок, которые были бы вам полезны:

http://geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx

И этот второй вопрос более по существу:

http://www.c-sharpcorner.com/UploadFile/tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx

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

Тогда вы сможете увидеть, где именно вам нужно сконцентрироваться, чтобы исправить проблему

Это не ответ на ваш общий вопрос, но вы можете отправить DataTable непосредственно в веб-службу без промежуточного этапа предварительной записи его в XML.На самом деле, вы не можете отправить DataTable, но вы может отправьте DataSet (поскольку DataSet сериализуем, а DataTable - нет), поэтому вы можете отправить DataTable напрямую, сначала заключив его в DataSet, а затем отправив DataSet.Протокол SOAP в любом случае преобразует DataSet в XML, поэтому вы на самом деле ничего не получаете, самостоятельно преобразуя DataTable в XML.

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

Что касается вашего общего вопроса, неудивительно, что иногда потребление вашей памяти увеличивается на 20 мб при чтении (и отправке) файла размером 7 мб.XML, используемый для описания DataTable и его содержимого (независимо от того, делаете ли вы это самостоятельно или оно автоматически сериализуется при прямой отправке в веб-службу), является очень многословный.

Ваш наиболее эффективный подход к этой проблеме состоял бы в том, чтобы отправить файлы данных клиента непосредственно в веб-службу (либо в виде массива с одним байтом [], либо в виде серии массивов с байтами []), а затем полностью обработать эти файлы на сервере.Такой подход сведет к минимуму время, необходимое для отправки каждого файла на сервер (поскольку отправка 7 мб занимает меньше времени, чем отправка 20 мб или даже больше).

Лучшая книга на эту тему, которую я читал, - это книга Джеффа Рихтера "CLR через C#:

http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=sr_1_1?ie=UTF8&qid=1252853101&sr=8-1-spell

Если вам нужна версия VB.NET, она есть для первого издания книги, но я не думаю, что был достаточный интерес к переводу книги на VB.NET для второй версии.Если вы действительно хотите изучить .NET, вам следует освоиться с C #.На обоих языках памятью управляет среда CLR.

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