7

关于如何在 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,例如在性能方面有效地做到这一点等。最好能够“稍后”继续下载它们,意思是“现在一部分,稍后另一部分” .

我还在hackage 上找到了 download-curl 包,但我不肯定这是一个很好的选择,甚至它会像我需要的那样逐块下载文件。

4

2 回答 2

12

Network.HTTP.Conduit提供三个函数来执行请求:

在这三个函数中,前两个函数将使整个响应体活在记忆中。如果要在常量内存中操作,请使用http函数。该http功能使您可以通过以下方式访问流接口ResumableSource

您在代码中提供的示例使用交错 IO 将响应主体写入恒定内存空间中的文件。因此,下载大文件时不会耗尽内存。

于 2014-07-13T06:45:13.997 回答
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 个包:conduitresourcethttp-conduit有点奇怪。

于 2021-03-27T23:49:25.950 回答