<div dir="ltr"><div><div>Hi Dear Haskellers,<br><br></div>I have this small program to grep recursively in parallel. It works fine, but generates the last line empty. Is this empty line coming from mapConcurrently()?<br><br>
</div><div>Thanks,<br><br></div><div>Hong<br></div><div><br><div>-- mygrepr.hs<br></div><div>-- <a href="http://lrf.pl">lrf.pl</a> is an old Perl script to get all non-duplicate files recursively under the current directory, since some of directories have tons of links<br>
</div>-- the program runs concurrently on either specified number of threads or 3/4 of the number of available cores<br><br>module Main (main) where<br><br>import Control.Concurrent.Async<br>import Control.Monad<br>import Data.List<br>
import Data.List.Split<br>import GHC.Conc<br>import System.Environment ( getArgs )<br>import System.Exit<br>import System.Process<br>import Text.Regex.Posix<br><br>main :: IO () <br>main = do<br> hs_argv <- getArgs<br>
if null hs_argv || any (=~ "-h") hs_argv || any (=~ "--h") hs_argv then<br> putStrLn "mygrepr [+RTS -N[x] -RTS] [OPTION]... PATTERN"<br> else do<br> numCores <- getNumProcessors<br>
numCapas <- getNumCapabilities<br> let numT | numCapas > 1 = numCapas<br> | otherwise = max numCapas (numCores `div` 4 * 3)<br> _ <- setNumCapabilities numT<br> let numThreads = fromIntegral numT :: Double<br>
findResult <- readProcess "<a href="http://lrf.pl">lrf.pl</a>" [] []<br> let files = lines findResult<br> let num_of_files = fromIntegral $ length files :: Double<br> let chunks = chunksOf (ceiling (num_of_files/numThreads)) files<br>
results <- mapConcurrently (grep hs_argv) chunks<br> let (_, grepResult, _) = unzip3 results<br> putStr $ unlines $ nub $ filter (\line -> not (line =~ "Binary file .* matches")) $ lines (concat grepResult)<br>
<br>grep :: [String] -> [String] -> IO (ExitCode, String, String)<br>grep hs_argv files = readProcessWithExitCode "/tool/pandora64/.package/grep-2.5.4/bin/grep" (hs_argv ++ files) []<br><br></div></div>