Program obrasta w pamiec

Program obrasta w pamiec
HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:18
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));
        }
    }
KL
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:42
1

Na pewno zacznij używać bloku using http://4programmers.net/C_sharp/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.

edytowany 1x, ostatnio: klemensior
Q4
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:103
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.

HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:18
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.

Q4
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:103
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.

HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:18
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 :):)

wedlock
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Bartoszyce
  • Postów:180
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.