我一般都听说生产代码应该避免使用Lazy I/O. 我的问题是,为什么?是否可以在懒散的I/O之外使用它?什么使替代品(例如调查员)更好?
我正在编写一个守护进程,它从一个小文件中读取内容,修改它,然后将其写回同一个文件.在尝试写入之前,我需要确保每个文件在阅读后立即关闭.我还需要确保每个文件在写完后立即关闭,因为我可能偶尔会立即再次阅读它.
我已经研究过使用二进制严格而不是二进制,但似乎只提供严格的Get,而不是严格的Put.与System.IO.Strict相同的问题.从阅读二进制严格的文档,我不确定它真的解决了我确保文件被迅速关闭的问题.处理这个问题的最佳方法是什么?DeepSeq?
这是一个高度简化的示例,可以让您了解我的应用程序的结构.此示例以.结尾
*** Exception: test.dat: openBinaryFile: resource busy (file is locked)
原因很明显.
import Data.Binary ( Binary, encode, decode )
import Data.ByteString.Lazy as B ( readFile, writeFile )
import Codec.Compression.GZip ( compress, decompress )
encodeAndCompressFile :: Binary a => FilePath -> a -> IO ()
encodeAndCompressFile f = B.writeFile f . compress . encode
decodeAndDecompressFile :: Binary a => FilePath -> IO a
decodeAndDecompressFile f = return . decode . decompress =<< B.readFile f
main = do
let i = …Run Code Online (Sandbox Code Playgroud)