diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hw-prim
-version:        0.6.2.19
+version:        0.6.2.20
 synopsis:       Primitive functions and data types
 description:    Primitive functions and data types.
 category:       Data
diff --git a/src/HaskellWorks/Data/ByteString.hs b/src/HaskellWorks/Data/ByteString.hs
--- a/src/HaskellWorks/Data/ByteString.hs
+++ b/src/HaskellWorks/Data/ByteString.hs
@@ -1,10 +1,13 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiWayIf        #-}
+{-# LANGUAGE BangPatterns        #-}
+{-# LANGUAGE FlexibleInstances   #-}
+{-# LANGUAGE MultiWayIf          #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Data.ByteString
   ( chunkedBy
   , ToByteString(..)
   , ToByteStrings(..)
+  , mmap
   , rechunk
   , rechunkPadded
   , resegment
@@ -13,8 +16,9 @@
   ) where
 
 import Control.Monad.ST
-import Data.Semigroup   ((<>))
+import Data.Semigroup     ((<>))
 import Data.Word
+import Foreign.ForeignPtr
 
 import qualified Control.Monad.ST.Unsafe       as ST
 import qualified Data.ByteString               as BS
@@ -24,6 +28,7 @@
 import qualified Data.Vector.Storable          as DVS
 import qualified Data.Vector.Storable.Mutable  as DVSM
 import qualified System.IO                     as IO
+import qualified System.IO.MMap                as IO
 import qualified System.IO.Unsafe              as IO
 
 class ToByteString a where
@@ -208,3 +213,9 @@
           if BS.null c
             then IO.hClose h >> return []
             else (c:) <$> lazyRead
+
+mmap :: FilePath -> IO BS.ByteString
+mmap filepath = do
+  (fptr :: ForeignPtr Word8, offset, size) <- IO.mmapFileForeignPtr filepath IO.ReadOnly Nothing
+  let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size
+  return bs
diff --git a/src/HaskellWorks/Data/Vector/Storable.hs b/src/HaskellWorks/Data/Vector/Storable.hs
--- a/src/HaskellWorks/Data/Vector/Storable.hs
+++ b/src/HaskellWorks/Data/Vector/Storable.hs
@@ -1,19 +1,23 @@
+{-# LANGUAGE BangPatterns        #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Data.Vector.Storable
   ( padded
   , foldMap
   , mapAccumL
+  , mmap
   ) where
 
 import Control.Monad.ST     (ST)
 import Data.Monoid          (Monoid (..), (<>))
 import Data.Vector.Storable (Storable)
 import Data.Word
+import Foreign.ForeignPtr
 import Prelude              hiding (foldMap)
 
 import qualified Data.Vector.Storable         as DVS
 import qualified Data.Vector.Storable.Mutable as DVSM
+import qualified System.IO.MMap               as IO
 
 {-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
 
@@ -42,3 +46,11 @@
             go (i + 1) a1 vc
           else return a0
 {-# INLINE mapAccumL #-}
+
+-- | MMap the file as a storable vector.  If the size of the file is not a multiple of the element size
+-- in bytes, then the last few bytes of the file will not be included in the vector.
+mmap :: Storable a => FilePath -> IO (DVS.Vector a)
+mmap filepath = do
+  (fptr :: ForeignPtr Word8, offset, size) <- IO.mmapFileForeignPtr filepath IO.ReadOnly Nothing
+  let !v = DVS.unsafeFromForeignPtr fptr offset size
+  return (DVS.unsafeCast v)
