2015-09-18 2 views
17

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 
+0

'libero -m' sarebbe più leggibile. – Sibi

+0

Se si cambia 'n' per essere piccoli, si ottiene comunque un errore di segmentazione? – Bakuriu

+0

@Bakuriu: No, almeno non sulla mia macchina. – Zeta

risposta

3

questo è due to a bug in primitive che apparentemente risolto nel recente rilasciato primitivo-0.6.1.0. Ti suggerisco di aggiungere un limite inferiore sul primitivo al tuo progetto di conseguenza.