Volevo scrivere un programma che funzioni su un array molto grande e che faccia molte operazioni di lettura/scrittura ad accesso casuale. Ho pensato vector
è il modo più adatto di farlo in Haskell, così ho scritto un semplice programma per testare le sue prestazioni:Come mai Haskell ha rilevato un errore di segmentazione quando il vettore è molto grande ma sotto il limite di memoria?
import Data.Int
import qualified Data.Vector.Unboxed.Mutable as UM
n = 1000000000
main = do
a <- UM.new n
UM.read a 42 :: IO Int32
Tuttavia, quando mi sono imbattuto, è riuscita con segmentation fault
:
$ ghc -O2 test.hs
$ ./test
Segmentation fault (core dumped)
Questa macchina ha una memoria più che sufficiente per l'array. Ecco l'output del free -h
:
total used free shared buffers cached
Mem: 251G 150G 100G 672K 419M 141G
-/+ buffers/cache: 9.2G 242G
Swap: 255G 870M 255G
Forse perché il pacchetto di Haskell vector
non può gestire le matrici molto grandi? Posso modificare il mio codice in modo che possa funzionare su array di grandi dimensioni senza troppi compromessi in termini di prestazioni?
Edit: La mia versione è GHC 7.10.2.20150906, e la mia versione vector
è 0.11.0.0. Questo è su una macchina Linux a 64-bit, con
> maxBound :: Int
9223372036854775807
'libero -m' sarebbe più leggibile. – Sibi
Se si cambia 'n' per essere piccoli, si ottiene comunque un errore di segmentazione? – Bakuriu
@Bakuriu: No, almeno non sulla mia macchina. – Zeta