Program obrasta w pamiec

0

Witam. Mam pytanie. Napisałem mały programik dodający zdjęcia do bazy danych. Na początku wybieram zdjęcie przez openFileDialog (zdjęcia JPG). Później wrzucam je do imageList i dodaje do listView żeby mieć podgląd zdjęć jakie chce dodać. Zauważyłem, że w momencie dodania zdjęcia do programu, ilość zużywanej pamięci wzrasta, i po zapisaniu zdjęć do bazy program zużywa nadal tą samą ilość pamięci. Dalej, dodaje kolejne i ilość zużytej pamięci dalej rośnie. Zanim zdjęcia zostaną dodane do bazy danych przetrzymuje je w List<byte[]>. Teraz pojawia się pytanie dlaczego tak jest? Czy da się coś zrobić? Z góry dziękuje za odpowiedź.
Poniżej dodam kod odpowiedzialny za dodanie zdjęcia.

private byte[] ConvertImageToByte(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

        return ms.ToArray();
    }

private void buttonDodaj_Click(object sender, EventArgs e)
{
openFileDialog.Filter = "Pliki JPG (.jpg)|.jpg";
if(openFileDialog.ShowDialog() == DialogResult.OK)
{
Image image = Image.FromFile(openFileDialog.FileName);

            imageList.Images.Add(image);
            ListViewItem item = new ListViewItem();                
            item.ImageIndex = imageList.Images.Count - 1;
            item.Text = "Moj obrazek";
            listViewZdjecia.Items.Add(item);

            zdjecia.Add(ConvertImageToByte(image));
        }
    }
1

Na pewno zacznij używać bloku using Using . A co do pamięci to zarządza nią GC więc to on sam wie kiedy i co może usunąć. Poza tym nie wiem jak chciałbyś to zrobić aby wczytywać dane do pamięci ale żeby jej nie zajmowały.

0

Rozwiązanie jest bardzo proste. Zamiast przechowywać w kolekcji dane obrazów, przechowuj odnośniki do nich (w postaci string). Program będzie zajmował o wiele mniej pamięci.

0

Dzięki za odpowiedź. Myślałem o tym żeby przechowywać odnośniki, ale żeby do listView dodać ikonę zdjęcia i tak muszę je wrzucić do imageList.

0
halbi napisał(a):

Dzięki za odpowiedź. Myślałem o tym żeby przechowywać odnośniki, ale żeby do listView dodać ikonę zdjęcia i tak muszę je wrzucić do imageList.

Więc w tym przypadku musisz tak rozplanować działanie programu, aby w danym czasie do pamięci ładowane były tylko te obrazy, które przeglądasz, a nie wszystkie jakie masz w bazie danych.

0

Jeśli chodzi o przeglądanie tak właśnie zrobię, natomiast jeśli chodzi o dodawanie coś pokombinuje jeszcze :). W każdym razie dziękuje bardzo :):)

0

Na portalu dotnetomaniak jest seria wpisów o działaniu GC. W sumie aby pozbyć się kolekcji z pamięci usuń wszystkie referencje do niej, a do kolekcji przypisz null. Nie spowoduje to zwolnienia pamięci od razu ale GC będzie wiedział, że może śmiało usunąć dane w momencie braku pamięci. Oczywiście przytka ci program w momencie zadziałania GC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1