.СЕТЬ. Минимизируйте использование памяти / оптимизируйте дизайн класса - PullRequest
0 голосов
/ 19 июля 2010

У меня есть следующий класс, который создается около 40 миллионов раз, и все его экземпляры занимают около 80% всей памяти процесса (более 15 ГБ).

class MyClass
{
    String Field1
    String Field2
    String Field3
    int Field4
    int Field5
    float Field6
    SomeEnum Field7
    Boolean Field8
    Boolean Field9
    Boolean Field10
    Byte Field11
    Byte Field12
}

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

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

Этот код будет работать в основном на сервере x64, x32 только в разработке.

EDIT:

Это служба, которая должна очень быстро возвращать результат, который зависит от всех этих данных. Очень быстро здесь около 20 мс-150 мс. Таким образом, все данные хэшируются и сортируются, и каждое поле в этом классе используется почти в каждом запросе к службе. Может быть, что-то здесь спроектировано плохо, но дизайн здесь не проблема, и я просто не могу изменить его прямо сейчас с нуля.

Ответы [ 4 ]

5 голосов
/ 19 июля 2010

Конечно, вы можете сделать все логические значения в одном поле. Кроме того, объединение значений enum и byte в одно поле может сэкономить вашу память, поскольку поля обычно выровнены и поэтому занимают больше места. В .NET также есть атрибуты для управления выравниванием элементов.

Но в конце у вас проблема с дизайном. Лучше попробуй редизайн своего приложения. Действительно ли все значения данных необходимы одновременно в память? Не могли бы вы поместить ненужные детали на жесткий диск и извлечь его только в случае крайней необходимости?

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

1 голос
/ 19 июля 2010

Поскольку строки, скорее всего, занимают наибольший объем памяти, вы можете попробовать интернирование строк.

1 голос
/ 19 июля 2010

Похоже на странный дизайн, и, если я не ошибаюсь, 15 ГБ / 40 миллионов - это больше 400. Таким образом, если предположить, что именно этот класс занимает большую часть пространства, это указывает на то, что каждый экземпляр использует сотни байтов.Я сомневаюсь, что это будет намного лучше, если сэкономить несколько байтов, изменив 3 bools на байты.

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

1 голос
/ 19 июля 2010

Простой ответ: вообще не использовать класс.

создано около 40 миллионов раз и все его экземпляры занимают около 80% всей памяти процесса (более 15GB).

Зачем? Похоже, вам нужна база данных. Любая конкретная причина?

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