有关于如何在Haskell中下载大文件的建议吗?我认为Http.Conduit是这个库是一个很好的库。但是,它是如何解决这个问题的?其文档中有一个示例,但它不适合下载大型文件,它只是下载文件:
import Data.Conduit.Binary (sinkFile)
import Network.HTTP.Conduit
import qualified Data.Conduit as C
main :: IO ()
main = do
request <- parseUrl "http://google.com/"
withManager $ \manager -> do
response <- http request manager
responseBody response C.$$+- sinkFile "google.html"
我想要的是能够下载大型文件而不会耗尽RAM,例如在性能方面做得很有效等。最好能够继续下载它们&#34;稍后&#34;,意思是&#34;现在某个部分,另一部分后来&#34;。
我也找到了download-curl package on hackage,但我不肯定这是一个不错的选择,甚至是按照我的需要按块下载文件块。
答案 0 :(得分:11)
Network.HTTP.Conduit
提供了三个执行请求的功能:
在这三个函数中,前两个函数将使整个响应体生存在内存中。如果要在常量内存中操作,请使用http
功能。 http
功能可让您通过ResumableSource
您在代码中提供的示例使用交错IO将响应正文写入常量内存空间中的文件。因此,下载大文件时不会耗尽内存。
答案 1 :(得分:2)
这对我有用:
import Control.Monad.Trans.Resource (runResourceT)
import Data.Conduit.Combinators (sinkFile)
import Network.HTTP.Conduit (parseRequest)
import Network.HTTP.Simple (httpSink)
downloadFile :: String -> IO ()
downloadFile url = do
request <- parseRequest url
runResourceT $ httpSink request $ \_ -> sinkFile "tmpfile"
我同意这样的任务需要四个不同的模块(来自 3 个包:conduit
、resourcet
和 http-conduit
)有点奇怪。