2009-09-13 2 views
4

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

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

  • Применение в основном Анализирует данные Файлы расположены на клиентской машине в DataSet/DataTables.
  • Затем с помощью DataView, он разрушает DataTables в manageble куски, пишет XML и передает данные XML в WebService.

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

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

Я посмотрел на .Net Memory Profiler и на самом деле не смог сделать из этого головы или хвосты.
Я много читал в Интернете относительно управления памятью на .Net в целом о Dispose и «Nothing» и DataSets и т. Д., Однако, на самом деле ничего не нашел в отношении VB.Net.

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

ответ

4

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

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

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

Существует несколько доступных ссылок, которые предоставят вам информацию о том, как работает управление памятью. У меня есть две записи в блоге, одна из которых рассказывает о Using Garbage Collection in .NET и о том, что перечисляет различные resources. Я использовал для создания двух презентаций по управлению памятью в .NET.

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

+0

@Scott, я читаю эти Документы и ценю указатели. Я попытаюсь снова использовать «Использование» (я пробовал это в прошлом). Пожалуйста, ознакомьтесь с моими комментариями ниже в MusiGenesis относительно дальнейшего разъяснения моей проблемы (однако я также обновлю свое оригинальное сообщение, чтобы уточнить) – Brian

+0

@Paul: не зная подробностей о том, что вы делаете в коде, трудно помочь сузить место, где вы могли бы быть сталкиваясь с проблемой. Убедитесь, что вы удаляете какие-либо одноразовые предметы, как только вы закончите с ними. Кроме того, ищите такие вещи, как конкатенация строк внутри петель. Вы не укажете, какую версию .NET Framework вы используете, но если вам нужно 3.0 или более поздней версии, вы можете посмотреть на использование двоичного сериализатора для отправки наборов данных через провод к веб-сервису, если это возможно. –

3

Управление памятью в 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

1

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

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

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

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

+0

Я использую dataset.writeXML сериализовать данные в формате XML. Моя реальная проблема заключается в том, что даже если я прокомментирую часть кода writeXML, данные не будут выпущены после простого анализа двоичного файла данных. У меня нет проблемы с временем передачи данных (не критически важная информация), и вы не хотите вводить задания cron на сервере, так как эти данные на клиентской машине меняются со временем, и это полезно при загрузке что клиентская машина хранит журнал того, сколько записей было отправлено, а также некоторые массивы данных, которые выполняются на клиенте на основе учетных данных и т. д. – Brian

+0

Редактирование: я хотел сказать ... «память не выпущена» (не данные) – Brian

+0

Редактировать: Выше, в основном, я говорю, что мне нужно удалить некоторые отдельные записи из файлов, прежде чем отправлять их на сервер, поэтому мне нужно анализировать независимо, а размер XML - это не проблема (так как это должно быть просто временной ошибкой в ​​памяти). Я просто хочу выяснить, как освободить память после отправки XML-файла на сервер, и программа просто ждет, чтобы проанализировать следующий файл. Я недостаточно опытен в Win Apps, чтобы узнать/отслеживать, где хранится эта память. – Brian

0

Лучшие книги, чтобы попасть на эту тему, что я прочитал в книге Джеффа Рихтера, 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.

2

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

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

Смежные вопросы