gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:11:30 25 4
gpt4 key购买 nike

设置

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

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

诀窍是确保所有文件永远不会同时存在于内存中,我之前的天真的解决方案在我的 Mac 上创建了各种交换文件。
另外,如果其中一个文件路径无效,我想跳过
它并继续执行该程序。

我的解决方案

目前我正在使用管道,如果可能的话,我想找到一个使用管道的解决方案。但如果它不是正确的工具,我可以使用其他工具。

最佳答案

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

{-# 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生产者将有效地分 block
一个文件的内容。

并且,根据 this Yesod article , sourceDirectoryDeep应该
有效地遍历目录结构。

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

关于haskell - 您将如何遍历目录并对所有文件执行某些功能并以内存有效的方式组合输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com