Я хотел написать программу, которая работает на действительно большом массиве, и делает много операций чтения/записи произвольного доступа. Я полагал, что 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
Однако, когда я запустил его, он потерпел неудачу с segmentation fault:
$ ghc -O2 test.hs
$ ./test
Segmentation fault (core dumped)
Этот аппарат имеет более чем достаточно памяти для массива. Вот результат free -h:
total used free shared buffers cached
Mem: 251G 150G 100G 672K 419M 141G
-/+ buffers/cache: 9.2G 242G
Swap: 255G 870M 255G
Было ли это потому, что пакет Haskell vector не может обрабатывать очень большие массивы? Могу ли я изменить свой код, чтобы он мог работать на больших массивах без чрезмерного компрометации производительности?
Изменить. Моя версия GHC - 7.10.2.20150906, а моя версия vector - 0.11.0.0. Это находится на 64-битной Linux-машине,
> maxBound :: Int
9223372036854775807