Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .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
Сообщений: 14,835
Репутация: 2903

icq: 512-7шесть5
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
Сообщений: 14,835
Репутация: 2903

icq: 512-7шесть5
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
Сообщений: 14,835
Репутация: 2903

icq: 512-7шесть5
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,350
Репутация: 3515
По умолчанию

Изначально проблема была в том, что на диске лежат 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




01:37.


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

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


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