在Haskell中从Internet下载大文件

时间:2014-07-13 01:48:50

标签: haskell networking http-conduit

有关于如何在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,但我不肯定这是一个不错的选择,甚至是按照我的需要按块下载文件块。

2 个答案:

答案 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 个包:conduitresourcethttp-conduit)有点奇怪。