2012-03-02 9 views
9

Recentemente, lavoro in C++ e devo creare un array[60.000][60.000]. Tuttavia, non posso creare questo array perché è troppo grande. Ho provato float **array o anche static float array ma non va bene. Qualcuno ha un'idea? Grazie per il vostro aiuto!Creare un array troppo grande in C++, come risolvere?

+0

Se è davvero necessario un array così grande, suggerisco di utilizzare un file mappato in memoria. Il tuo sistema operativo verrà mappato solo nelle pagine a cui accedi se non riesci a inserire l'intera cosa nella memoria. –

+0

Inoltre, si * si * su un sistema operativo a 64 bit, giusto? –

+0

Sì, sto usando Windows 64-bit –

risposta

15

Una matrice di dimensioni 60,000 x 60,000 ha elementi 3,600,000,000.

Stai usando tipo float in modo che diventi:

60,000 x 60,000 * 4 bytes = 14,400,000,000 bytes ~= 13.4 GB 

Avete anche che la quantità di memoria nella macchina?


Nota che la questione della pila vs heap Non importa nemmeno se non si dispone di memoria sufficiente per cominciare.


Ecco una lista di possibili problemi:

  • Non si dispone di memoria sufficiente.
  • Se la matrice è dichiarata globalmente, si supererà la dimensione massima del file binario.
  • Se la matrice è dichiarata come array locale, si farà saltare la pila.
  • Se si sta compilando per 32 bit, si è superato di molto il limite di indirizzamento da 2 GB/4 GB.
+0

in realtà, ho 20GB! –

+0

Come non funziona? Messaggio di errore? Crash? – Mysticial

+0

"Questa applicazione ha richiesto al runtime di terminarlo in un modo insolito." Io uso devC ed è quello che ho ottenuto zzz. –

1

per inizializzare l'array 2D di carri che si desidera, avrete bisogno di:

60000 60000 * * 4 byte = 14400000000 byte

che è di circa 14 GB di memoria. Questo è un sacco di memoria. Per mantenerlo anche teoricamente, dovrai eseguire una macchina a 64 bit, per non parlare di quella con un bel po 'di RAM installata.

Inoltre, l'allocazione di questa quantità di memoria non è quasi mai necessaria nella maggior parte delle situazioni, sei sicuro che non si potrebbero fare ottimizzazioni qui?

EDIT:

Alla luce di nuove informazioni dai vostri commenti su altre risposte: hai solo 4 GB di memoria (RAM). Il tuo sistema operativo dovrà quindi caricare almeno 9 GB sul disco rigido, in realtà probabilmente di più. Ma hai anche solo 20 GB di spazio sul disco rigido. Questo è appena sufficiente per sfogliare tutti quei dati, specialmente se il disco è frammentato. Infine, (potrei sbagliarmi perché non hai dichiarato esplicitamente) è abbastanza probabile che tu stia utilizzando una macchina a 32 bit. Questo non è realmente in grado di gestire più di 4 GB di memoria alla volta.

1

Allocare la memoria in fase di runtime: considerare l'utilizzo di un file mappato in memoria come supporto. Come tutti dicono, 14 concerti sono un sacco di memoria. Ma non è irragionevole trovare un computer con 14 GB di memoria, né è irragionevole inserire la memoria se necessario.

Con una matrice di queste dimensioni, è probabile che diventerai molto curioso sulle prestazioni di accesso alla memoria. Ricordati di considerare la granularità della cache della tua architettura di destinazione e se il tuo target ha un TLB potresti essere in grado di utilizzare pagine più grandi per alleviare la pressione del TLB.Poi di nuovo, se non hai abbastanza memoria probabilmente ti interesserai solo alla velocità di I/O di archiviazione.

Se non è già ovvio, avrete bisogno di un'architettura che supporti uno spazio di indirizzamento a 64 bit per accedere direttamente a questa memoria/convenientemente.

+0

Un file mappato in memoria "morde" nello spazio di indirizzamento della memoria virtuale del processo. Quindi un processo a 32 bit non sarà in grado di accedere a più di 2 GB (o 4 GB quando "ampio spazio di indirizzamento è sensibile") _at a time_ anche con file mappati in memoria. Il processo a 64 bit funzionerà, ma sarà anche in grado di indirizzare direttamente quella quantità di memoria, il che vanifica lo scopo dell'utilizzo del file mappato in memoria. OTOH, se l'obiettivo è caricare selettivamente parti del file fisico effettivo in base alle necessità, senza mappare troppo del file in un dato momento, quindi il file mappato in memoria è appropriato. –

2

"60.000" significa in realtà "60000"? In tal caso, la dimensione della memoria richiesta è 60000 * 60000 * sizeof(float), ovvero circa 13,4 GB. Un tipico processo a 32 bit è limitato a solo 2 GB, quindi è chiaro il motivo per cui non si adatta.

D'altra parte, non vedo perché non dovresti essere in grado di adattarlo a un processo a 64 bit, supponendo che la tua macchina abbia abbastanza RAM.

+0

yeap, ho> HDD da 20 GB e RAM da 4 GB –

+0

@Kingfisher 4 GB di RAM? Quindi stai facendo affidamento sullo scambio?!?!? – Mysticial

+0

@Kingfisher - Questo è il tuo problema - stai confondendo memoria (RAM) con lo spazio su disco, che sono entrambe cose diverse. –