What about this? I&#39;ve tested on my pc and seems pretty fast. The trick is to generate the gen only once. Not sure if the inlines helps, though:<div><br></div><div><div>import qualified Data.Text as T</div><div>import System.Random.MWC</div>
<div>import Control.Monad</div><div>import System.IO</div><div>import Data.ByteString as B</div><div>import Data.Word (Word8)</div><div>import Data.ByteString.Char8 as CB</div><div><br></div><div><br></div><div>{- | Converts a Char to a Word8. Took from MissingH -}</div>
<div>c2w8 :: Char -&gt; Word8</div><div>c2w8 = fromIntegral . fromEnum</div><div><br></div><div><br></div><div>charRangeStart :: Word8</div><div>charRangeStart = c2w8 &#39;a&#39;</div><div>{-# INLINE charRangeStart #-}</div>
<div><br></div><div>charRangeEnd :: Word8</div><div>charRangeEnd = c2w8 &#39;z&#39;</div><div>{-# INLINE charRangeEnd #-}</div><div><br></div><div>--genString :: Gen RealWorld -&gt; IO B.ByteString</div><div>genString g = do</div>
<div>    randomLen &lt;- uniformR (50 :: Int, 450 :: Int) g</div><div>    str &lt;- replicateM randomLen $ uniformR (charRangeStart, charRangeEnd) g</div><div>    return $ B.pack str</div><div><br></div><div><br></div><div>
writeCorpus :: FilePath -&gt; IO [()]</div><div>writeCorpus file = withFile file WriteMode $ \h -&gt; do</div><div>  let size = 100000</div><div>  _ &lt;- withSystemRandom $ \gen -&gt;</div><div>      replicateM size $ do</div>
<div>        text &lt;- genString gen :: IO B.ByteString</div><div>        CB.hPutStrLn h text</div><div>  return [()]</div><div><br></div><div>main :: IO [()]</div><div>main =  writeCorpus &quot;test.txt&quot;</div></div>
<div><br></div><div><br></div><div><br></div><div>A.</div>