首页 文章

你将如何遍历目录并对所有文件执行某些功能并以高效的内存方式组合输出?

提问于
浏览
5

Setting

我需要遍历100个.txt文件的目录,打开每个文件并对每个文件执行一些功能,然后合并结果 . 这些文件很大,大约10GB . 伪造的代码中的一些常见操作可能是:

foldr concatFile mempty $ openFile <$> [filePath1, ..., filePathn]
foldr countStuff 0      $ openFile <$> [filePath1, ..., filePathn]

诀窍是确保所有文件同时存在于内存中,我以前的天真解决方案在我的mac上创建了各种交换文件 . 另外,如果其中一个filePath无效,我想跳过它继续该程序 .

My Solution

目前我正在使用管道,并希望尽可能找到使用管道的解决方案 . 但如果它不是正确的工具我可以使用别的东西 .

1 回答

  • 3

    您可以像这样嵌套管道执行:

    {-# LANGUAGE OverloadedStrings #-}
    
    import Conduit
    import qualified Data.ByteString as BS
    
    -- Process a single file
    processFile :: FilePath -> IO ()
    processFile path = runResourceT (sourceFile path =$= mapC BS.length $$ sumC) >>= print
    
    -- Run processFile for directory in a tree    
    doit :: FilePath -> IO ()
    doit top = runResourceT $ sourceDirectoryDeep False top $$ mapM_C (liftIO . processFile)
    

    processFile 替换为您想要做的任何事情 - 包括忽略该文件 . 我的理解是 sourceFile Producer将有效地分块文件的内容 .

    并且,根据this Yesod articlesourceDirectoryDeep 应该有效地遍历目录结构 .

    你显然不能用 sourceDirectoryDeep 做的事是修剪目录 .

相关问题