Gerçekten çok büyük bir dizide çalışan bir program yazmak istedim ve çok fazla rasgele erişimli okuma/yazma işlemi yapıyor. Ben vector
Haskell bunu yapmanın en uygun yolu düşündüm, bu yüzden onun performansını test etmek için basit bir program yazdım: ben koştum zamanHaskell, vektör çok büyük ama hafıza limiti altındayken segmentasyon hatası nasıl oluyor?
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
Ancak, segmentation fault
ile başarısız oldu:
$ ghc -O2 test.hs
$ ./test
Segmentation fault (core dumped)
Bu makinede dizi için fazlasıyla bellek var. Haskell'ın vector
paket büyük diziler işleyemez çünkü
total used free shared buffers cached
Mem: 251G 150G 100G 672K 419M 141G
-/+ buffers/cache: 9.2G 242G
Swap: 255G 870M 255G
oldu: İşte free -h
çıktı mı? Kodumu, çok fazla performans ödün vermeden büyük dizilerde çalışacak şekilde değiştirebilir miyim?
Düzenleme: My GHC sürüm 7.10.2.20150906, ve benim vector
sürümü 0.11.0.0 olduğunu. Bu, burada son yayımlanan ilkel-0.6.1.0 giderilmiştir due to a bug in primitive olan
> maxBound :: Int
9223372036854775807
'ücretsiz -m 'daha okunabilir olur. – Sibi
Eğer n'yi küçük olarak değiştirirseniz, hala bölümleme hatası verir mi? – Bakuriu
@Bakuriu: Hayır, en azından makinemde değil. – Zeta