Problemy z pamięcią

0

Napisałem program, w którym definiuję 100 tys. rekordów (1rekord=300bajtów) w miarę dopisywania kodu zaczęły dziać się dziwne rzeczy tzn. przestały być tworzone dynamicznie obiekty a co w związku z tym program generuje wewnętrzny błąd, który informuje mnie, że nie został stworzony obiekt i nie można do niego załadować np. bitmapy.
Stwierdziłem, że kiedy zmniejszyłem rozmiar ilości rekordów do 90tys. wszystko działało. Program rozwijał się w zawrotnym tempie i znów pojawił się ten sam problem, więc zmniejszyłem do 80tys rekordów, ale niestety to nie jest rozwiązanie, ponieważ potrzebuję napisać jeszcze wiele kodu a nie wchodzi w grę obcinanie ilości rekordów wręcz przeciwnie potrzebuję zwiększyć.
Poradźcie, co zrobić z tym fantem jak rozwiązać problem lub gdzie należy ustawić parametry w Delphi 4

Pozdrowienia dla życzliwych.

0

Pamiec nie powinna byc problemem, jesli trzymasz wszystko na stercie. 100 tys. rekordow to tylko 30 MB (chyba, ze masz jakis zlom z 32MB calkowitej pamieci wirtualnej, ale nie podejrzewam Cie o to, bo raczej Delphi bys nie uruchomil). Pisales cos, ze nie mozna zaladowac bitmapy. Czy te obiekty nie rezerwuja jeszcze jakis zasobow systemowych? Czy nie dostaja jakis uchwytow (np. HBITMAP)? W Windows liczba wszystkich uchwytow jest ograniczona - moze to powoduje problemy.

Z drugiej strony sprawdz, ile Twoja aplikacja zajmuje po zaladowaniu do pamieci. Moze masz wyciek, i moze reszta aplikacji zajmuje w szybkim czasie np. ponad 200 MB i wykraczasz poza dostepna pamiec.

BTW: Pisanie aplikacji, ktora trzyma wszystkie 100 tys. rekordow w pamieci jest troche nieprzyzwoite. Nie mozesz uzyc bazy danych? Albo napisac tego w sposob bardziej optymalny?

0

Tak wywala mi się przy tworzeniu HBitmap gdzie ładuję po jej stworzeniu bitmapę a następnie wszystkim oknom zmieniam brusha odwołując się do uchwytu stworzonej bitmapy czyli :
form1.brush.bitmap:=HBitmap;
form2.brush.bitmap:=HBitmap;
itd.
Co do ilości pamięci i miejsca dysku to nie wchodzi w grę bo jest jej wystarczająco dużo.
Używam dużej ilości uchwytów ale do ilości $FFFF to mi bardzo daleko.
w sumie tworzę dynamicznie 5 obiektów HBitmap i około 300 TMenu czy jakoś tak.
Niestety problem znika kiedy zmniejszam sukcesywnie ilość rekordów.

Więc co może być przyczyną ???
Lub gdzie coś należy ustawić ???

0

Co jest trzymane w rekordzie? Jakie operacje sa zwiazane z tworzeniem rekordu?

0

To prosty typ rekordowy
nazwa1:string[40];
nazwa2:string[30];
nazwa3:string[10];
nazwa4:string[15];
nazwa5:string[18];
nazwa6:string[40];
nazwa7:string[40];
nazwa8:byte;
nazwa9:word;
nazwa10:boolean;

no i oczywiście wszystko x 100tys.

0

To dziwne, nie powinno miec znaczenia. Czy kod, ktory tworzy te rekordy, lub cos na nich miesza uzywa tez jakis komponentow VCL / f. WinAPI, np. czy miesza cos na uchwytach? Bo moze tam sie nie zwalnia jakis uchwyt. To nie musi byc wcale Twoj blad, to moze byc blad w Delphi (choc mniej prawdopodobne). Ktora masz wersje? Jaki masz syst. op.?

Jesli nie mozna tego wyjasnic w normalny sposob, to moze gdzies przy manipulowaniu tymi rekordami zamazujesz sobie niechcacy jakis kawalek pamieci nalezacy do VCL. Tyle, ze taki blad raczej ujawnialby sie w przypadkowych momentach. Wlasnie - czy blad wystepuje zawsze w tym samym momencie?

0

Wlasnie - czy blad wystepuje zawsze w tym samym momencie?

Tak błąd powstacje w zdarzeniu OnCREATE głównej formy a co dalej idzie przerywa całe zdarzenie i przeskakuje do OnActiwe gdzie dalej pracuje normalnie i stabilnie.

Globalnie jest ustawiona zmienna :
obrazek:Hbitmap;

w sekcji OnCreate tworze obiekt a następnie <ort>prubuję </ort>do niego załadować bitmapę program wywala się ponieważ obiekt nie został stworzony.
Jeśli zmniejszam ilość rekordów to wszystko jest ok.

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