2013-03-15 17 views
5

Ho un vettore molto grande (milioni di voci da 1024 byte ciascuna). Sto superando la dimensione massima del vettore (ottenendo una brutta eccezione di allocazione di memoria). Sto facendo un'operazione ricorsiva sul vettore di elementi che richiede l'accesso ad altri elementi nel vettore. Le operazioni devono essere eseguite rapidamente. Sto cercando di evitare di scrivere sul disco per motivi di velocità. C'è un altro modo per memorizzare questi dati che non richiederebbero la scrittura su disco? Se devo scrivere i dati su disco, quale sarebbe il modo più ideale per farlo>C++ vector out of memory

modificare per qualche altro dettaglio.

Le operazioni che sto eseguendo sul set di dati stanno generando una stringa in modo ricorsivo in base ad altri punti di dati nel vettore. I dati vengono ordinati quando vengono letti. Set di dati compresi tra 50.000 e 50.000,0000.

+5

Non possiamo davvero dire nulla senza sapere di più sui vostri dati. – NPE

+0

Quanta memoria è necessaria? Quanta memoria hai a disposizione? –

+3

Hai bisogno di avere memoria contigua per qualunque cosa tu stia facendo? In caso contrario, un semplice cambiamento sarebbe utilizzare invece 'std :: deque'; dovrebbe consentire di memorizzare molti più elementi prima di esaurire la memoria. – Praetorian

risposta

-1

Questo è 1 GB di memoria (1024 KB * 10^6 = 1 MB * 10^3 = 1 GB). Idealmente per una macchina a 32 bit è possibile eseguire fino a 4 GB di memoria. Per rispondere alla tua domanda, prova prima una normale chiamata malloc() e assegna 1 GB di memoria. Questo dovrebbe essere fatto senza errori. Inoltre, si prega di incollare il messaggio di errore esatto che si ottiene durante l'utilizzo del vettore.

+0

Quasi le uniche informazioni utili fornite dall'OP nella domanda è l'errore che sta vedendo - * eccezione di allocazione della memoria errata *, nota anche come [std :: bad_alloc'] (http://en.cppreference.com/w/cpp/ memory/new/bad_alloc) – Praetorian

+0

utilizzando ** malloc ** era una risposta :) –

+1

È una risposta sbagliata. La domanda dice milioni, non 1 milione. Anche supponendo che siano solo 2-3 milioni, non vi è alcuna garanzia che una macchina a 32 bit possa allocare 2-3 GB di spazio di indirizzamento contiguo. Alcuni spazi di indirizzamento saranno usati per il kernel, per le librerie condivise, per lo stack, ecc. –

9

Il modo più semplice per risolvere questo problema è utilizzare STXXL. È una reimplementazione dell'STL per le grandi strutture che scrive in modo trasparente sul disco quando i dati non si adattano alla memoria.

+0

Grazie questo dovrebbe aiutare. – user2174896

+4

Se i dati devono essere contigui, come sarà la guida STXXL? Qualsiasi tipo di scrittura su disco (trasparente o non) interrompe la contiguità. – Yakk

+0

@Yakk, non è realmente contiguo, presenta solo la stessa interfaccia di 'std :: vector'. La domanda non chiede che sia contigua, o almeno non lo ha fatto quando ho postato la risposta. –

0

Poiché i dati devono essere contigui e si conosce quanti elementi è necessario memorizzare, è sufficiente creare un std::vector e utilizzare la funzione reserve() per tentare di ottenere un blocco contiguo di memoria della dimensione richiesta.

C'è poco overhead nella memorizzazione di un vettore (solo alcuni indicatori per gestire l'inizio e la fine). Questo è buono come sarai in grado di fare.

Se non funziona:

  • aggiungere più memoria al vostro computer (non può effettivamente aiutare, se si è a corto contro indirizzamento o di implementazione vincoli)
  • passare a un allineamento grezzo
  • find un modo per ridurre le dimensioni dei vostri elementi
  • cercare di trovare una soluzione in grado di affrontare il problema in piccoli blocchi
+1

L'aggiunta di più memoria alla macchina non comporterà nulla su un sistema operativo moderno alla dimensione massima di un 'vector', presupponendo che l'utente abbia consentito una quantità sufficiente di memoria virtuale. L'allocazione riguarda lo spreco di spazio degli indirizzi, non la memoria. Anche allora, un sistema operativo può distribuire più spazio per l'indirizzo di quello per cui hanno memoria virtuale, e fallire solo quando la memoria viene effettivamente modificata. – Yakk

+0

Ah, corretto. grazie. –

+0

Questo è esattamente quello che ho capito. Grazie. – user2174896

3

Il tuo problema non può essere risolto come dichiarato e chiarito nei commenti.

È stato richiesto un modo per avere un buffer contiguo in memoria di 50.000.000 voci di dimensione 1024 su un sistema a 32 bit.

Un sistema a 32 bit ha solo 4294967296 byte di memoria indirizzabile. Si richiedono 51200000000 byte di memoria indirizzabile o 11,9 volte la quantità di spazio di indirizzamento della memoria sul sistema.

Se non si richiede che i dati siano contigui e indirizzabili per la memoria, se non si richiede che i dati siano tutti in memoria in una volta sola, o se si rilevano altri requisiti, potrebbe esserci una risposta al proprio problema. Vale a dire, alcuni sistemi operativi espongono l'accesso a uno spazio non di memoria di valori che corrisponde alla RAM (in cui i modi in 8 sistemi Windows gig per utilizzare più di 4 GB di RAM totale) attraverso alcune interfacce hacky o altro.

Ma come detto, la risposta è "no, non puoi farlo".

+0

Questo è quello che ho capito. Grazie. – user2174896

+1

@ user2174896 per essere chiari, la mia risposta significa "stai facendo la domanda sbagliata", non "non puoi risolvere il tuo problema attuale". Dubito fortemente che il tuo problema reale sia "51200000000 byte di spazio di memoria continuo su un sistema operativo a 32 bit" – Yakk

Problemi correlati