Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 24.10.2017, 08:49   #1
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 11
Репутация: 10
По умолчанию WPF Сокращение потребления оперативной памяти приложением

Добрый день. Создаю приложение - просмотрщик фотографий. Столкнулся с такой проблемой, что при загрузке изображений под каждый мегабайт изображения в оперативной памяти выделяется 10 Мб. Т.е. у меня папка с 60 картинками (занимает 25 Мб на диске) при открытии в приложении занимает 250 МБ.
Сам класс для хранения фотографий выглядит следующим образом:
Код:

public class Photo : BaseModel
    {
        public Photo(string path, int n)
        {
            _path = path;
            _source = new Uri(path);
            _name = Path.GetFileNameWithoutExtension(path);
            _numb = n;
        }

        public override string ToString()
        {
            return _source.ToString();
        }

        private string _path;
        public string FullPath { get { return _path; } }

        private int _numb;
        public int PhotoNumber { get { return _numb; } set { _numb = value; } }

        private string _name;
        public string FileName { get { return _name; }}

        private Uri _source;
        public string Source { get { return _path; } }
    }

Подскажите, пожалуйста, можно ли как-то это оптимизировать и сократить количество потребляемой памяти? Т.к. по сути мне нужны только превью картинки, но при этом, чтобы я мог их масштабировать элементом Slider.
Auratos вне форума   Ответить с цитированием
Старый 24.10.2017, 08:57   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,401
Репутация: 3353

icq: 512-765
skype: alexp.frl
По умолчанию

Вряд ли дело в этом классе.
Цитата:
Сообщение от Auratos Посмотреть сообщение
Т.е. у меня папка с 60 картинками (занимает 25 Мб на диске) при открытии в приложении занимает 250 МБ.
А с 30, 1, 0?
Alex11223 вне форума   Ответить с цитированием
Старый 24.10.2017, 09:09   #3
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вряд ли дело в этом классе.
А с 30, 1, 0?
При первом запуске и пустом окне (0 картинок) - ~35 Мб.
При одной картинке весом 600 Кб - ~45 Мб.
Auratos вне форума   Ответить с цитированием
Старый 24.10.2017, 09:11   #4
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 11
Репутация: 10
По умолчанию

Если это поможет, то загружаю фотографии по такому принципу:
Код:

public class PhotoCollection : ObservableCollection<Photo>
    {
        public PhotoCollection() { }

        public PhotoCollection(string path) : this(new DirectoryInfo(path)) { }

        public PhotoCollection(DirectoryInfo directory)
        {
            _directory = directory;
            Update();
        }

        public string Path
        {
            set
            {
                _directory = new DirectoryInfo(value);
                Update();
            }
            get { return _directory.FullName; }
        }

        private void Update()
        {
            this.Clear();
            try
            {
                foreach (FileInfo f in _directory.GetFiles("*.jpg"))
                    Add(new Photo(f.FullName, cnt));

            }
            catch (DirectoryNotFoundException)
            {
                System.Windows.MessageBox.Show("No Such Directory");
            }
        }

        DirectoryInfo _directory;
    }

Auratos вне форума   Ответить с цитированием
Старый 24.10.2017, 09:23   #5
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,401
Репутация: 3353

icq: 512-765
skype: alexp.frl
По умолчанию

Тут просто строки, тут неоткуда 10 МБ взяться.

Скорее всего это нормально потому что в памяти они хранятся не в виде JPG, надо смотреть на размер (в пикселях), будет примерно ширина*высота*4 байтов. (4 — ARGB)

Если вам нужны только маленькие превью, то создавайте их сами (грузите по 1 картинке и уменьшайте перед выводом, освобождайте память занятую исходной).
Alex11223 вне форума   Ответить с цитированием
Старый 24.10.2017, 09:52   #6
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Тут просто строки, тут неоткуда 10 МБ взяться.
Скорее всего это нормально потому что в памяти они хранятся не в виде JPG, надо смотреть на размер (в пикселях), будет примерно ширина*высота*4 байтов. (4 — ARGB)
Все равно как-то многовато выходит. Что еще странно, до того момента, как я заметил огромное потребление памяти, я у себя еще хранил изображение в Bitmap
Код:

public Photo(string path)
        {
            _path = path;
            _source = new Uri(path);
            _image = BitmapFrame.Create(_source);
            _metadata = new ExifMetadata(_source);
        }

private BitmapFrame _image;
public BitmapFrame Image { get { return _image; } set { _image = value; } }

Т.е. по логике, хранилась копия изображения в памяти. Я убрал эти 3 строки, но памяти не стало тратиться меньше ни на мегабайт. Вот тут я что-то и подвис...
Auratos вне форума   Ответить с цитированием
Старый 24.10.2017, 10:35   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,401
Репутация: 3353

icq: 512-765
skype: alexp.frl
По умолчанию

Там кеш какой-то есть, может оно не грузит копию снова.

https://referencesource.microsoft.co...mapFrame.cs,63 —> https://referencesource.microsoft.co...Decoder.cs,284
Alex11223 вне форума   Ответить с цитированием
Старый 24.10.2017, 15:51   #8
pu4koff
ПрофессионалФорумчанин
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,458
Репутация: 3616
По умолчанию

Изначально проблема была в том, что на диске лежат jpeg, а в программе всё равно идёт bmp, вот отсюда и размер большой. В приведённых примерах кода вообще нет никаких картинок и не откуда там браться потреблению памяти. Или что-то не то запускаете или баг какой-то.
ЗЫ. Уверены, что нужно Uri использовать? На входе ж всё равно строка, а Uri лишнее место занимает и на некоторых путях может поломаться.
__________________
http://coub.com/view/2hhtg
pu4koff вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замена оперативной памяти jakubad Железо 5 22.02.2017 17:24
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Восстановить из оперативной памяти Problemaumenya Помощь студентам 1 08.05.2008 23:01
Текстирование оперативной памяти arxipmen Assembler 6 23.11.2007 15:30
выделение оперативной памяти Alar Общие вопросы Delphi 0 29.10.2006 22:56


08:26.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru