当向量非常大但是在内存限制下时,Haskell怎么会出现分段错误?

xzh*_*zhu 17 haskell

我想编写一个在一个非常大的数组上运行的程序,并进行大量的随机访问读/写操作.我认为这vector是在Haskell中最合适的方式,所以我写了一个简单的程序来测试它的性能:

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
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它失败了segmentation fault:

$ ghc -O2 test.hs
$ ./test
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

这台机器有足够的内存用于阵列.这是输出free -h:

             total       used       free     shared    buffers     cached
Mem:          251G       150G       100G       672K       419M       141G
-/+ buffers/cache:       9.2G       242G
Swap:         255G       870M       255G
Run Code Online (Sandbox Code Playgroud)

是因为Haskell的vector包无法处理非常大的数组吗?我可以修改我的代码,以便它可以在大型阵列上工作而不会有太多的性能损失吗?


编辑:我的GHC版本是7.10.2.20150906,我的vector版本是0.11.0.0.这是在一台64位的linux机器上

> maxBound :: Int
9223372036854775807
Run Code Online (Sandbox Code Playgroud)

Rei*_*ton 4

这是由于原语中的一个错误造成的,该错误显然已在最近发布的原语-0.6.1.0 中修复。我建议您相应地为您的项目添加原语的下限。