Я хотел написать программу, которая работает на действительно большом массиве, и делает много операций чтения/записи произвольного доступа. Я полагал, что 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