kizia Temat założony przez niniejszego użytkownika |
Jak sprawdzić ile maksymalnie mogę dynamicznie zaalokować pamięci [C] » 2015-01-23 10:57:19 Tak jak w temacie, bo internet mówi że się nie da sprawdzić, a wykładowca sądzi coś innego. Znalazłem że alloc.h może być pomocne ale nic nie mogę go znaleźć w internecie. Jakieś pomysły? |
|
darko202 |
» 2015-01-23 12:53:07 spójrz na https://www.youtube.com/watch?v=0DQl74alJzw~16 min. alokacja pamięci polega na przydzielenia dla zmiennej określonego adresu np. int 4b stąd ograniczeniem maksymalnej ilości jest maksymalna długość słowa bitowego, czyli w systemach 32 bitowych 2^32 = ~4GB, w 64 bitowym 2^64 itd. (musimy oczywiści wziąć po uwagę, ze ileś tam adresów jest zarezerwowana na zmienne systemowe, inne programy jeśli int zajmie 4 b (2^32) / 4 = 4294967296b /4 = 1073741824 zmiennych int a jeśli jakaś struktura będzie miała np. 102 b (2^32) / 102 = 42107522 możemy zaalokować tych struktur |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-23 15:41:40 Rozumiem ale liczba int mnie nie ogranicza, bo jest to wystarczajaco duzo. Teraz sprawdziłem i mogę zaalokować maksymalnie ok. int NUMBER = 480000000; zmiennych przy 8 gigasach, ale nie o to chodzi, nawet jakby mi tylko 2 zmienne pozwolił zaalokować to bym się nie obraził, nieważne. Tylkoo kwestia jak sprawdzić ile. Tak żeby to śmigało na jednym komputerze gdzie jest 8 gb i na drugim gdzie ramu jest 128 mb. Tą maksymalną wartość dla jakiej mogę utworzyć dynamicznie tablicę.
I próbowałem to zrobić w ten sposób że relokować pamięć i skakać co 16mb i tak w kółko. Realokuję, jeżeli nie mam wsk == NULL to zwiększam moją liczbę elementów i zwalniam tablice, a gdy wreszcie dostanę wsk == NULL to zmniejszam o 16 mb ( przed chwilą udało mi się tyle przydzielić to teraz też powinno ), oczywiście wszystko co było wcześniej zaalokowane jest zwolnione, jedyne co pozostało z poprzedniego procesu to wartość zmiennej dla jakiej udało się zaalokować tablicę. Problem w tym że zazwyczaj dostawałem wynik w granicach 500mb czyli dużo mniej niż tak naprawdę mógłbym zaalokować ( NUMBER = 480000000 - prawdopodobnie 1,7 gb )
Ponoć są jakieś biblioteki do tego żeby to sprawdzić np. spotkałem się z bibliteką alloc.h ale nie mogę jej znaleźć żeby sciagnać, zresztą nie wiem czy się nadaje. Macie jakieś pomysły jak to sprawdzić, albo znacie jakieś biblioteki które to zrobią? |
|
michal11 |
» 2015-01-23 18:31:07 Mam tylko nadzieję, że to realokowanie robisz sobie w celach edukacyjnych i nie masz zamiaru wykorzystać tego w żadnym normalnym programie. |
|
DejaVu |
» 2015-01-23 19:03:27 1. Powodzenie lub niepowodzenie alokacji zależy od stopnia pofragmentowania pamięci. 2. Proces 32-bitowy nie może zaalokować więcej jak 2GB pamięci łącznie. llocation size limitsThe largest possible memory block malloc can allocate depends on the host system, particularly the size of physical memory and the operating system implementation. Theoretically, the largest number should be the maximum value that can be held in a size_t type, which is an implementation-dependent unsigned integer representing the size of an area of memory. In the C99 standard and later, it is available as the SIZE_MAX constant from <stdint.h>. Although not guaranteed by ISO C, it is usually 2CHAR_BIT × sizeof(size_t) − 1.
|
Źródło: http://en.wikipedia.org/wiki/C_dynamic_memory_allocationAs per C90 standard guarantees that you can get at least one object 32 kBytes in size, and this may be static, dynamic, or automatic memory. C99 guarantees at least 64 kBytes. For any higher limit, refer your compiler's documentation.
Also, malloc's argument is a size_t and the range of that type is [0,SIZE_MAX], so the maximum you can request is SIZE_MAX, which value varies upon implementation and is defined in <limits.h>.
| http://stackoverflow.com/questions/2798330/maximum-memory-which-malloc-can-allocate |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-23 20:38:22 Zmienna size_t w żaden sposób mnie nie ogranicza, bo jak to przeliczałem to wychodzi ok 15 gb. Czyli chyba najwięcej pamięci jestem w stanie zaalokować poprzez taką metodę prób i błędów, dopóki komputer nie odmówi mi pamięci ;d Bo faktycznie przez fragmentację może nie wyglądać tak kolorowo. Ale jakby ktoś znalazł gotową funkcje do sprawdzania tego to proszę dać znać :P |
|
pekfos |
» 2015-01-23 22:38:40 Jeśli potrzebujesz tyle pamięci, to jeden blok nie jest właściwą strukturą danych. Zmienna size_t w żaden sposób mnie nie ogranicza, bo jak to przeliczałem to wychodzi ok 15 gb. |
15? Skąd..? |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-24 06:38:34 Ale chodzi właśnie o to że ja wcale nie potrzebuję, praktycznie, dużej pamięci, jeżeli dostanę 8 bajtów bo tyle jest mi w stanie przydzielić system to też będzie dobrze, kwestia tylko jak poprawnie spradzać ile faktycznie system w danej chwili ma ochotę przydzielić. Co myślicie o takim właśnie alokowaniu i zwalnaniu pamięci, takie ręczne sprawdzanie?
unsigned int = 4294967295 * 4 / 1024 / 1024 / 1024 = 15,9 |
|
« 1 » 2 |