diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # lzlib
 
+## 1.0.6.0
+
+  * Export `compressFineTune`
+
 ## 1.0.5.0
 
   * Export `LZError`
diff --git a/lzlib.cabal b/lzlib.cabal
--- a/lzlib.cabal
+++ b/lzlib.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               lzlib
-version:            1.0.5.0
+version:            1.0.6.0
 license:            BSD3
 license-file:       LICENSE
 copyright:          Copyright: (c) 2019-2020 Vanessa McHale
diff --git a/src/Codec/Lzip.hs b/src/Codec/Lzip.hs
--- a/src/Codec/Lzip.hs
+++ b/src/Codec/Lzip.hs
@@ -16,7 +16,11 @@
                   , compressFileLevel
                   , compressFileBest
                   , compressFileFast
+                  , compressFineTune
                   , CompressionLevel (..)
+                  , LzOptions (..)
+                  -- * Decompression
+                  , decompress
                   , LZErrno
                     ( LzMemError
                     , LzHeaderError
@@ -24,8 +28,6 @@
                     , LzDataError
                     , LzLibraryError
                     )
-                  -- * Decompression
-                  , decompress
                   -- * Miscellany
                   , lZVersion
                   , lZApiVersion
@@ -65,8 +67,8 @@
     deriving (Enum)
 
 data LzOptions = LzOptions
-    { _dictionarySize :: !Int
-    , _matchLenLimit  :: !Int
+    { dictionarySize :: !Int
+    , matchLenLimit  :: !Int
     }
 
 encoderOptions :: CompressionLevel -> LzOptions
@@ -186,7 +188,9 @@
 compressFast :: BSL.ByteString -> BSL.ByteString
 compressFast = compressWith Zero
 
--- | @since 1.0.0.0
+-- | Use this to avoid forcing the whole file into memory at once
+--
+-- @since 1.0.0.0
 compressFile :: FilePath -> IO BSL.ByteString
 compressFile = compressFileLevel Six
 
@@ -216,14 +220,20 @@
                -> BSL.ByteString
                -> Int -- ^ Size of data being compressed, in bytes.
                -> BSL.ByteString
-compressWithSz level bstr sz = runST $ do
+compressWithSz cl = compressFineTune (encoderOptions cl)
 
+compressFineTune :: LzOptions
+                 -> BSL.ByteString
+                 -> Int -- ^ Size of data being compressed, in bytes.
+                 -> BSL.ByteString
+compressFineTune opts bstr sz = runST $ do
+
     let bss = BSL.toChunks bstr
         delta = sz `div` 4 + 64
 
     (buf, enc) <- LazyST.unsafeIOToST $ do
         buf <- mallocForeignPtrBytes delta
-        encoder <- lZCompressOpen (fromIntegral $ dictionarySize sz) (fromIntegral matchLenLimit) (fromIntegral memberSize)
+        encoder <- lZCompressOpen (fromIntegral $ dictionarySize' sz) (fromIntegral matchLenLimit') (fromIntegral memberSize)
         enc <- newForeignPtr lZCompressClose (castPtr encoder)
         pure (buf, enc)
 
@@ -273,6 +283,5 @@
         memberSize = maxBound
 
         -- saves memory
-        dictionarySize = max (fromIntegral lZMinDictionarySize) . min (_dictionarySize $ encoderOptions level)
-        matchLenLimit = _matchLenLimit opts
-        opts = encoderOptions level
+        dictionarySize' = max (fromIntegral lZMinDictionarySize) . min (dictionarySize opts)
+        matchLenLimit' = matchLenLimit opts
