Получение исключения «недостаточно памяти» в этой относительно простой программе - PullRequest
6 голосов
/ 05 февраля 2010

Вот мой класс Picture.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;

namespace SharpLibrary_MediaManager
{
    public class Picture:BaseFile
    {
        public int Height { get; set; }
        public int Width { get; set; }
        public Image Thumbnail { get; set; }

        /// <summary>
        /// Sets file information of an image from a given image in the file path.
        /// </summary>
        /// <param name="filePath">File path of the image.</param>
        public override void  getFileInformation(string filePath)
        {
            FileInfo fileInformation = new FileInfo(filePath);
            if (fileInformation.Exists)
            {
                Name = fileInformation.Name;
                FileType = fileInformation.Extension;
                Size = fileInformation.Length;
                CreationDate = fileInformation.CreationTime;
                ModificationDate = fileInformation.LastWriteTime;
                Height = calculatePictureHeight(filePath);
                Width = calculatePictureWidth(filePath);                
            }
        }

        public override void getThumbnail(string filePath)
        {            
            Image image = Image.FromFile(filePath);
            Thumbnail = image.GetThumbnailImage(40, 40, null, new IntPtr());            
        }

        private int calculatePictureHeight(string filePath)
        {
            var image = Image.FromFile(filePath);
            return image.Height;
        }

        private int calculatePictureWidth(string filePath)
        {
            var image = Image.FromFile(filePath);
            return image.Width;
        }
    }
}

И здесь я использую этот класс для извлечения информации из каждого файла в данной папке:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace SharpLibrary_MediaManager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string folderPath = @"D:\Images\PictureFolder";

        private void button1_Click(object sender, EventArgs e)
        {
            DirectoryInfo folder = new DirectoryInfo(folderPath);
            List<Picture> lol = new List<Picture>();
            foreach (FileInfo x in folder.GetFiles())
            {
                Picture picture = new Picture();
                picture.getFileInformation(x.FullName);
                lol.Add(picture);
            }

            MessageBox.Show(lol[0].Name);
        }
    }
}

Я получаю исключение "Недостаточно памяти" и не знаю почему. Это первый раз, когда я делаю что-то подобное, поэтому я довольно плохо знаком с пакетной обработкой файлов и т. Д.

Любая помощь, ребята? :)

Edit: Я открыл диспетчер задач, чтобы увидеть использование памяти, и когда я нажимаю кнопку, чтобы запустить метод, я замечаю, что мое использование памяти увеличивается на 100 МБ ~ каждую секунду.

Редактировать 2: В моей папке около 103 изображений, каждое из которых составляет ~ 100 КБ. Мне нужно решение, где не имеет значения, сколько изображений в папке. Кто-то порекомендовал открыть изображение, сделать мою магию, а затем закрыть его. Я не очень понимаю, что он имел в виду под «близким».

Может кто-нибудь порекомендовать другой подход? :)

Редактировать 3: Все еще получая исключение нехватки памяти, я изменил код в Picture.cs на основе рекомендаций, но у меня нет идей. Любая помощь?

public override void  getFileInformation(string filePath)
        {
            FileInfo fileInformation = new FileInfo(filePath);

            using (var image = Image.FromFile(filePath))
            {
                if (fileInformation.Exists)
                {
                    Name = fileInformation.Name;
                    FileType = fileInformation.Extension;
                    Size = fileInformation.Length;
                    CreationDate = fileInformation.CreationTime;
                    ModificationDate = fileInformation.LastWriteTime;
                    Height = image.Height;
                    Width = image.Width;
                }
            }
        }

Кроме того, я должен открыть новый вопрос теперь, когда он немного вырос?

Ответы [ 11 ]

0 голосов
/ 05 февраля 2010

Несколько человек упомянули, что призыв к утилизации был сделан с изображениями Тем не менее, этого недостаточно, и что .NET Framework сделает для вас по мере увеличения использования памяти. Поскольку вы добавили каждое изображение в связанный список, платформа .NET не может его утилизировать, поскольку вы неявно сохраняете ссылку.

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

[Редактировать] удалил часть ответа, который другие указали как не относящийся к делу; Я предположил, что класс картинки - это класс картинки XNA.

...