Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2017, 07:49   #1
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 20
По умолчанию 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, 07:57   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вряд ли дело в этом классе.
Цитата:
Сообщение от Auratos Посмотреть сообщение
Т.е. у меня папка с 60 картинками (занимает 25 Мб на диске) при открытии в приложении занимает 250 МБ.
А с 30, 1, 0?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2017, 08:09   #3
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 20
По умолчанию

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

Если это поможет, то загружаю фотографии по такому принципу:
Код:
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, 08:23   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

Если вам нужны только маленькие превью, то создавайте их сами (грузите по 1 картинке и уменьшайте перед выводом, освобождайте память занятую исходной).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2017, 08:52   #6
Auratos
Пользователь
 
Регистрация: 01.06.2015
Сообщений: 20
По умолчанию

Цитата:
Сообщение от 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, 09:35   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

https://referencesource.microsoft.co...mapFrame.cs,63 —> https://referencesource.microsoft.co...Decoder.cs,284
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2017, 14:51   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замена оперативной памяти jakubad Компьютерное железо 5 22.02.2017 16:24
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Восстановить из оперативной памяти Problemaumenya Помощь студентам 1 08.05.2008 23:01
Текстирование оперативной памяти arxipmen Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 23.11.2007 14:30
выделение оперативной памяти Alar Общие вопросы Delphi 0 29.10.2006 21:56