Problem z alokacją dużej macierzy

0

Witam.
Podczas robienia pracy domowej natrafiłem na problem dla mnie nie do przeskoczenia. Mianowicie moim zadaniem jest zadeklarować macierz typu double o rozmiarach 100 000 na 100 000, a następnie wyzerować wszystkie jej elementy. Mam przy tym skorzystać ze wskaźnika i operatora "new".

Napisałem coś takiego:

// zadanie 5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{

	double **tablica2D= new double*[100000];
	for (int i = 0; i < 100000; i++)
	{
		tablica2D[i]= new double[100000];
	}
	for (int i = 0; i < 100000; i++)
	{
		for (int j = 0; j < 100000; j++)
		{
			tablica2D[i][j]=0;
		}
	}
}

Co już wiem:

  • program zatrzymuje się przy macierzy rzędu 2476 na 100 000 i kończy działanie;
  • nie można zaalokować więcej niż 4 GB pamięci;

Czego nie wiem:

  • jak rozwiązać ten problem;

Bardzo proszę o pomoc.
Nadmienię, że ostatnio styczność z C++ miałem dwa lata temu, więc prosiłbym o proste tłumaczenie. :)

0

Wiesz, że chcesz zaalokować (100000 * 4) na wskaźniki + (100000 * 100000 * 8) na elementy = 80000400000 bajtów = 74,5 gigabajtów pamięci?

Zadanie, o którym mówisz zapewne trzeba wykonać w inny sposób.

3

Można zaalokować więcej niż 4GB pamięci, jak się tyle ma...
Jak puścisz ten programik na jakimś klastrze to pójdzie bez problemu ;]

0

@Rew Tak, wiem, ile pamięci zajęłaby prosta alokacja. Polecenie jest jasne: "Przy użyciu wskaźnika i operatora new zadeklaruj macierz dwuwymiarową typu
double xy o rozmiarze 100 000 na 100 000 i wyzeruj wszystkie elementy macierzy. "

@Shalom Ja mam 8 GB, a program się wywala jak alokuje mniej więcej 4. ;D

To może się da zrobić tak, żeby wszystkie elementy macierzy odwoływały się tylko do jednej komórki, skoro i tak wszystkie mają być równe zero?
Ewentualnie, może jest możliwość, żeby "powiedzieć" programowi, żeby nie męczył się alokując 8 bajtów na element, skoro i tak tam będzie zero? :D

0

Możesz napisać własną klasę, która elementy będzie alokować na zasadzie copy-on-write. Sama obsługa dzięki przeładowaniu operatorom [] nie będzie się zbytnio różnić od zwykłej tablicy, ale nie za bardzo odnosi się to do polecenia zadania.
Prawdopodobnie autor tego zadania jest niespełna rozumu.

0

Ych, klasy to już nie moja liga. ;p
Z C++ miałem właściwie tylko pół semestru wprowadzenia.

Ewentualnie w zadaniu jest literówka i powinno być 10 000 na 10 000. :D

0

A może w tym zadaniu masz macierze rzadkie po prostu (to jest taka macierz gdzie większość komórek jest 0 i takie macierze przechowuje się inaczej żeby nie marnowac pamięci)? Może przeczytasz to zadanie ze zrozumieniem?

0
Shalom napisał(a):

A może w tym zadaniu masz macierze rzadkie po prostu (to jest taka macierz gdzie większość komórek jest 0 i takie macierze przechowuje się inaczej żeby nie marnowac pamięci)? Może przeczytasz to zadanie ze zrozumieniem?

Całą treść zadania przytoczyłem dwa posty wyżej. O macierzach rzadkich słyszę pierwszy raz. Poszperam, zobaczę, co mi się uda znaleźć. Dzięki.

0

o_O? No ale skoro to wszystko mają być 0 to po co w ogóle coś alokować? Chyba nie ogarniam...

0

Polecenie jest jasne: "Przy użyciu wskaźnika i operatora new zadeklaruj macierz dwuwymiarową typu
double xy o rozmiarze 100 000 na 100 000 i wyzeruj wszystkie elementy macierzy. "
Jak jasne to jasne — napisz taki kod i tyle. A że nie działa? Bo za mało RAM-u :-)

PS. na 64-bitowym systemie powinno dać się program odpalić gdy ustawimy np. 128 GB swapa.
Na 32 bitach z dodatkową gimnastyką (Address Windowing Extensions) można dojść do 64 GB, co w tym zadaniu będzie i tak za mało.

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