C # winforms .net 4.7 пределы памяти - PullRequest
0 голосов
/ 27 сентября 2019

В моем проекте я беру видеокадры один за другим, сжимаю их в 1x1 пиксель и затем получаю его цвет для хранения в списке.Проблема в том, что если я беру ~ 9,5-минутное видео, при 25 кадрах в секунду он обрабатывает только около 15-20%, прежде чем ему не хватает памяти на 2 ГБ.Но я использую 64-битную ОС и процессор, и я не знаю, как выделить больше оперативной памяти для моего проекта.Кроме того, список цветов будет читаться быстро (25-30 раз в секунду), поэтому я не думаю, что создание временных файлов является опцией, или, по крайней мере, я хотел бы попытаться выделить больше оперативной памяти.Итак, вопрос: как мне выделить более 2 ГБ для моего кода .net 4.7?

Код обработки моего изображения:

List<Color> VideoFramesData = new List<Color>();

//fires when i click "parse"  button in my form:   
private void ParseVideoButton_Click(object sender, EventArgs e)
        {
            while (VideoReader.Read()) 
            {
                VideoFramesData.Add(CollapseBitmap(VideoReader.GetFrame()));
            }
        }

//Image downscaling function:

public Color CollapseBitmap(Bitmap bmp)
        {
            Color FrameColor;
            Bitmap result = new Bitmap(1, 1);
            Graphics g = Graphics.FromImage(result);
            g.InterpolationMode = InterpolationMode.NearestNeighbor;

            g.DrawImage(bmp, 0, 0, 1, 1);
            FrameColor = result.GetPixel(0, 0);
            result.Dispose();
            g.Dispose();
            return FrameColor;
        }

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Ладно, сгладил мою проблему: я не был Bitmap.Dispose'ing параметра функции bmp, и оказывается, что вы должны это сделать.Ну, чем больше я знаю!

0 голосов
/ 27 сентября 2019

Я не знаю, поможет ли это вам, но у меня есть проект с открытым исходным кодом под названием Transparency Maker, и одна из вещей, которая действительно ускорила мою программу, - это переключение с BitMap.GetPixel & SetPixel на использование этого классаназывается DirectBitmap.cs, который кто-то написал о переполнении стека.

https://github.com/DataJuggler/TransparencyMaker/blob/master/TransparencyMaker/Util/DirectBitmap.cs

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

(я простоперечитайте этот код, и часть «История» относится только к моему приложению, но остальное тоже самое).

Вот полный проект, если вы хотите увидеть его в рабочем примере.

https://github.com/DataJuggler/TransparencyMaker/

Я хотел кое-что сделать с видео, но пока не обновлял Transparency Maker из одного кадра за раз.

Кто-то только что опубликовал в Твиттере на прошлой неделе, яникогда не пробовал, но графические процессоры могут помочь вам загрузить оперативную память в другой процесс, если у пользователя есть хороший.(Не уверен, аудитория вашего инструмента).

https://www.reddit.com/r/csharp/comments/cyp44a/i_made_computesharp_a_free_net_standard_21_lib_to/

...