Подтвердить что ты не робот

Почему 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

Однако, когда я запустил его, он потерпел неудачу с 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
4b9b3361

Ответ 1

Это из-за ошибки в примитиве, которая, по-видимому, исправлена ​​в недавно выпущенном примитиве-0.6.1.0. Я предлагаю вам добавить нижнюю границу примитива к вашему проекту соответственно.