【发布时间】:2019-05-12 20:09:49
【问题描述】:
streaming-bytestring 库在打印大约 512 个字节后出现错误。
错误:
openBinaryFile: resource exhausted (Too many open files)
代码:
import Control.Monad.Trans (lift, MonadIO)
import Control.Monad.Trans.Resource (runResourceT, MonadResource, MonadUnliftIO, ResourceT, liftResourceT)
import qualified Data.ByteString.Streaming as BSS
import qualified Data.ByteString.Streaming.Char8 as BSSC
import System.TimeIt
main :: IO ()
main = timeIt $ runResourceT $ dump $ BSS.drop 24 $ BSS.readFile "filename"
dump :: MonadIO m => BSS.ByteString m r -> m ()
dump bs = do
isEmpty <- BSS.null_ bs
if isEmpty then return ()
else do
BSSC.putStr $ BSS.take 1 bs
dump $ BSS.drop 1 bs
【问题讨论】:
-
我不确定它是否会帮助更有知识的人回答您的问题,但是,
listenNaiveStreaming来自哪里?至少它不在hoogle上。此外,imoiterate使用 LambdaCase 并使用do表示法而不是手动>>=ing 会更容易阅读。 -
我修正了错字。我不熟悉 LambdaCase;我会调查的!
-
请注意,流媒体库通常不会加快速度。见stackoverflow.com/a/55814664/7203016。
-
@K.A.Buhr 谢谢,实际上其他帖子也是我写的。我仍在努力使这项工作正常进行,但我会在未来的实际项目中牢记您的评论。
-
我的第一个直觉是每次迭代都会打开一个文件。能不能把
readFile "filename"拉出来,只传入文件句柄?