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?
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
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
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