Ograniczenie pamięci podczas uruchamiania programu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
wojtusp7
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 14 gru 2010, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Ograniczenie pamięci podczas uruchamiania programu

Post autor: wojtusp7 »

Witam
Mam taki problem i nie mogę znaleźć rozwiązania.
Napisałem pewien problem, mniejsza z tym jaki :)
I została zadeklarowana spora tablica i kompiluje się, a przy uruchomieniu segmentation fault.
Z tego wnioskuję, że system nakłada pewne ograniczenie pamięci i jak je nieco zwiększyć?

P.S. Program na pewno dobry, ponieważ dobrze działa z mniejszą tablicą.
I odpada użycie dynamicznych tablic :)

Z góry dziękuję :)
norvoles
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1113
Rejestracja: 04 sty 2008, 20:58
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64

Odp: Ograniczenie pamięci

Post autor: norvoles »

Segmentation fault zwykle oznacza, że próbujesz dobrać się do jakiegoś obszaru pamięci, do którego nie masz dostępu.
I odpada użycie dynamicznych tablic
A to czemu? Wydaje mi się, że do tworzenia dużych tablic, to właśnie te dynamiczne są wskazane.
Jeśli możesz, pokaż kod.

Edit:
Z tego wnioskuję, że system nakłada pewne ograniczenie pamięci i jak je nieco zwiększyć?
Segfault pojawia się też jak odnosisz się do adresu w pamięci, który fizycznie nie istnieje, więc tablica może być zwyczajnie za duża :P

@down
Racja, racja :)
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Odp: Ograniczenie pamięci

Post autor: ethanak »

norvoles pisze: tablica może być zwyczajnie za duża :P
Raczej za mała
Кто жопой родился, чижиком не помрёт
wojtusp7
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 14 gru 2010, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Ograniczenie pamięci

Post autor: wojtusp7 »

W kodzie nie ma nic ciekawego, działa dla mniejszych tablic, ale mogę pokazać :)
postac tab[2000000];
int zestawy;
scanf("%d",&zestawy);
for(int i=1;i<=zestawy;i++)
{
int s,n;
scanf("%d %d",&n,&s);
for(int q=0;q<n;q++)
scanf("%s %d",tab[q].imie,&tab[q].naturalna);
}
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: borzole »

To ma podobno coś wspólnego ze stosem i ograniczeniami nałożonymi przez sam kompilator. Można to obejść na kilka sposobów
* pisząc static przed deklaracją
* deklarując wskaźnik i do niego dopiero przypisując tablicę (używa się tak samo)
* <vector>

przykładzik

Kod: Zaznacz cały

#include <iostream>
#include <vector>

using namespace std;

int main(void){
	const int x = 20000000;
	static int a[x];
	int *p = new int[x];
	cout << "x " << x << endl;
	p[x]=0;
	cout << "p " << p[x] << endl;

	vector<int> v;
	for (int i = 0; i < x; i++){
		try{ v.push_back(0); }
		catch (...){
			cout << v.size() << endl;
			return 1;
		}
	}

	cout << "v " << v.size() << endl;

	return 0;
}
wojtusp7
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 14 gru 2010, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: wojtusp7 »

Serdecznie dziękuję pomogło static, chociaż nie wiem dlaczego :)
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: borzole »

Jak już wspomniałem, to ma coś wspólnego ze stosem :) Słówko static sprawia, że tablica będzie traktowana jak globalna (w sensie zapisu w pamięci), a na zmienne globalne nie ma ograniczeń tzn. można poza main() zadeklarować sporą tablicę:

Kod: Zaznacz cały

int g[20000000];
int main(void){
...
to dopiero rozkminka co :)

W google wpisz c++ static 'stack frame'

Kiedy wywoływana jest funkcja, wówczas przenoszona jest ona do obszaru pamięci 'ramka stosu' (?) gdzie ma się pomieścić adres funkcji, wskaźnik na wywołującą funkcję (rodzica) i lokalne zmienne. Jeśli deklarujesz zwykłą tablicę to jej rozmiar zapycha przydzieloną dla funkcji pamięć. Jeśli użyjesz wskaźnika, to zamiast ogromnej tablicy będzie malutki, kilku bajtowy adres. Natomiast słówko static ozn. istnienie tylko jednego egzemplarza tej tablicy w całym programie, więc pewnie też jest używany tylko adres.
wojtusp7
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 14 gru 2010, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: wojtusp7 »

Dzięki, jako globalna tez działa.
Awatar użytkownika
Hauleth
Wytworny Kaczor
Wytworny Kaczor
Posty: 382
Rejestracja: 18 sie 2008, 17:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: Hauleth »

Na globalne są też ograniczenia, ale większe. Na malloc/new też jest, ale tylko 1: ilość pamięci w systemie.
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: Ograniczenie pamięci podczas uruchamiania programu

Post autor: borzole »

Jest jeszcze limit dla procesu narzucony przez system: ulimit/pam (coś jeszcze?).
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości