2015-09-18 10 views
17

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 
+0

'ücretsiz -m 'daha okunabilir olur. – Sibi

+0

Eğer n'yi küçük olarak değiştirirseniz, hala bölümleme hatası verir mi? – Bakuriu

+0

@Bakuriu: Hayır, en azından makinemde değil. – Zeta

cevap

3

ile, 64 bit Linux üzerinde mevcuttur. Buna göre projenize ilkel olarak daha düşük bir sınır eklemenizi öneriyorum.