2014-10-31 2 views
6

Ho scritto una funzione di manipolazione delle liste sia su F # che su Scala per confrontare le prestazioni. Per verificare che la funzione mi serve per inizializzare un elenco da 1 a 100000000.Scala vs F # nell'intervallo da 1 a 100000000

F #:

let l = [1..100000000];; 

reale: 00: 00: 32,954, CPU: 00: 00: 34,593, GC gen0: 1030 , gen1: 520, gen2: 9

Questo funziona.

Scala: opzione Scala -J-Xmx2G

val l = (1 to 10000000).toList // works 

val l = (1 to 100000000).toList // no response long while and finally got java.lang.OutOfMemoryError: Java heap space 

Con 100 milioni (100.000.000), nessuna risposta per lungo tempo (un'ora), con l'utilizzo della CPU del 75% al ​​90% e l'utilizzo della memoria da 2 GB e finalmente ottenuto java.lang.OutOfMemoryError: spazio heap Java.

Sto facendo qualcosa di sbagliato in Scala?

+0

Provi ad aumentare la memoria? Probabilmente quando si genera un processo di esecuzione del programma di raccolta dei dati inutili e si utilizza il 90% della CPU. – krynio

+0

Ci sono tonnellate di overhead in una scala 'List' per tanti elementi. Non stai facendo nulla di sbagliato; è solo un sacco di allocazione di oggetti. L'unica raccolta che posso costruire di quella dimensione in un tempo ragionevole sembra essere una matrice. – Nate

+0

Le dimensioni heap F # sono limitate in modo simile a 2 GB? L'elenco stesso, supponendo 8 byte interi e 8 byte puntatori, occupa almeno 1,6 GB di memoria heap. – lea

risposta

5

noti che val l = (1 to 100000000).toList crea un nuovo List con contenuti dall'originale Range(1 to 100000000), quindi la possibilità di una carenza di spazio mucchio, nonché pesante attivazione del collettore spazzatura. Aumentare -J-Xmx come suggerito da @krynio.

Tuttavia senza modificare la dimensione dell'heap, considerare l'utilizzo di iteratori, in particolare se il test delle prestazioni si basa su un'iterazione sequenziale sull'elenco; così

(1 to 100000000).iterator 
res0: Iterator[Int] = non-empty iterator 
+0

Grazie a @enzyme. In realtà, ho usato '-J-Xmx2G' per il caso di cui sopra. E la funzione di manipolazione delle liste si basa sulla caratteristica di testa e coda di List, in particolare '+:' operatore antefatto. –