2014-09-08 9 views
12

Sono un po 'confuso dall'allocazione della memoria in Julia. I know from the FAQ che la cancellazione della memoria utilizzata da una grande variabile viene effettuata impostandola su qualcosa di piccolo (come 0) e quindi eseguendo gc().Confuso dall'assegnazione della memoria e dalla garbage collection in Julia

Tuttavia, sono un po 'confuso dal seguente. Creo un caso Float32 matrice:

@time A = rand(Float32, 10000, 10000); 

time indica che ~ 400MB di RAM è stato assegnato, e di Julia utilizzo di RAM aumenta di 400 MB. Questo ha senso.

ho quindi applicare fft, ma non impegnano il risultato a qualsiasi variabile:

@time fft(A); 

time indica che ~ 800MB di RAM è stato assegnato, e di Julia utilizzo di RAM aumenta di 800 MB.

Tuttavia,, l'utilizzo della RAM rimane superiore di 1,2 GB rispetto all'inizio. E questo mi confonde, perché non ho equiparato alcuna variabile a fft(A), quindi mi aspetto che gli 800 MB allocati vengano immediatamente liberati dopo l'esecuzione dello fft.

ho provato a correre gc, pensando che Julia sarebbe rendersi conto che v'è stato un ulteriore 800MB di RAM che veniva utilizzato per niente:

gc(); 

Questo non fa nulla. L'utilizzo della RAM rimane a ~ 1,3 GB.

Tuttavia, i seguenti due linee,

A = 0; 
gc(); 

libera tutte 1.2GB che è in uso, nonostante il fatto che sizeof(A) è solo 400MB. Quindi la mia domanda è:

  • Perché apparire come se un oggetto che è 400MB di dimensione (secondo sizeof) in realtà ha 1.2GB assegnato ad esso?
+3

Dai un'occhiata a 'whos()' tra ogni comando. 'ans' prende un po 'di spazio. – rickhg12hs

+2

@ rickhg12hs: Oh, quindi i dati vengono assegnati a 'ans', * anche se il comando termina con un punto e virgola *? Wow, ok, questo ha senso, anche se sembra contro-intuitivo per un principiante come me. Mentire a dirlo come risposta, quindi posso accettare? – DumpsterDoofus

+1

La virgola è solo per sopprimere l'output, come in MATLAB (che l'ha ispirato). Non penso che questo caso sul quale ti sei imbattuto qui si presenti molto perché normalmente si assegnano i risultati a qualcosa, ma è interessante. – IainDunning

risposta

10

Ogni comando restituisce qualcosa, anche se è solo nothing. ans viene assegnato a ciascun oggetto restituito anche se non esiste un'assegnazione diretta e anche se il comando termina con un punto e virgola.

Utilizzare whos() tra i comandi per visualizzare i compiti e lo spazio allocato.