2009-03-26 4 views
2

Учитывая устаревшую систему, которая делает интенсивное использование DataSets и практически без возможности замены их с бизнесом-объектами или другими, более эффективными структурами данных:Сведение к минимуму объема памяти ADO.NET DataSet?

Существуют ли какие-либо методы для уменьшения объема памяти в DataSet?

Я думаю о таких вещах, как установка начальной емкости (когда известно), удаление ограничений и т. Д., Но у меня мало опыта работы с DataSets и я не знаю, какие конкретные варианты могут быть доступны мне или если бы кто-либо из них имел значение вообще.

Update:

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

Из-за того, что данные хранятся внутри страны, установка начальной емкости может быть одним из методов, поскольку это помешает объекту выделять произвольно большой объем памяти при добавлении только одной строки.

ответ

0
  1. Если вы используете VS2005 +, вы можете создавать объекты DataTable, а не весь DataSet. В 2003 году, если экземпляр DataTable был создан, он поставляется с DataSet по умолчанию. 2005 и после этого вы получаете только DataTable.

  2. Посмотрите на свой уровень доступа к данным для заполнения DataSet или DataTables. Чаще всего происходит слишком много данных. Сделайте ваши запросы более конкретными.

  3. Удостоверьтесь, что код, который вы используете, не имеет ничего общего с копиями DataSets, когда они передаются. Убедитесь, что вы используете. Выбирайте инструкции или DataViews для фильтрации и сортировки, а не для копирования.

Для DataSets не так много быстрых «оптимизаций». Если у вас возникли проблемы с памятью, используйте пункты 2 и 3. Это будет иметь место независимо от того, какой тип транспорта данных вы будете использовать.

И получите хорошие данные в DataSets. Если вы не знакомы с ними, вы можете делать глупые вещи, как ни с чем. Затем вы напишете статьи о том, как они сосут, которые действительно являются статьями о том, как мало вы о них знаете. Они действительно очень полезны и просты в обслуживании. Несколько советов:

  • Использовать типизированные DataSets. Они сэкономит вам порывы кодирования, и они напечатаны, что помогает с простой проверкой.
  • Если вы используете типизированные DS, убедитесь, что вы не изменяете сгенерированный файл кода. Если вы используете VS2005 +, вы можете поместить любое поведение пользовательских бизнес-объектов в частичный класс для DS (не файл кода .designer).
  • Используйте DataView и. Выберите, где бы вы ни находились, зацикливая объекты DataRow.
  • Осмотрите инструмент хорошего генерации кода и создайте рациональную структуру доступа к данным для заполнения и обновления от DS. Одна из проблем заключается в том, что иногда дизайнеры связывают дизайн DS напрямую с таблицами в db, что делает дизайн хрупким для изменения структуры данных. Если вы это сделаете, создайте или используйте генератор кода для создания своего уровня доступа к данным из db, например CodeSmith. Начните с рассмотрения некоторых шаблонов CodeSmith для генерации хранимых классов procs и доступа к данным.
  • Помните, когда вы разговариваете с кем-то о «объектах» и «DataSets», объектом в этом случае является DataRow, а не DataSet. И из-за частичных классов вы можете поместить поведение на «объект», получая вам 95% преимуществ «объектов» для тех, кто любит писать код.
1

Этому несчастливо, чтобы помочь вам, но это может очень помочь в тех же случаях.

Если вы храните много строк, которые одинаковы в наборе данных, например. имена городов, посмотрите только на один строковый объект с каждой отдельной строкой.

например.

Directory <string, string> towns = new Directory <string, string>(); 
foreach(var row in datatable) 
{ 
    if (towns.contains(row.town)) 
    { 
     row.town = towns[row.town] 
    } 
    else 
    { 
     towns[row.town] = row.town; 
    } 
} 

Тогда GC может вернуть большинство из дублирующих строк, однако это работает только если наборы данных живет по времени.

Возможно, вы захотите сделать это в событии rowCreated, чтобы все дублированные строковые объекты не были созданы на первом месте.

+0

Возможно, это будет идея. Необходимо проверить это на некоторых реальных данных, чтобы измерить уменьшение памяти и влияние на циклы процессора. –

0

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

Как только большая часть вашего кода просто использует интерфейсы, вы можете использовать генератор кода для создания класса C#, который реализует эти интерфейсы без накладных расходов на строки/таблицы.

Однако это может быть дешевле только для перехода на 64-битный и купить больше бара ...

+0

Eegads! Озадачивает! –

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