首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行搜索文件

并行搜索文件
EN

Stack Overflow用户
提问于 2015-11-07 11:37:34
回答 2查看 543关注 0票数 0

我想发出一个命令,并行地搜索给定数量的文件以获取一个给定的单词,其中.

代码语言:javascript
复制
ppatternsearch [-p n] word {files}
  1. ppatternsearch是命令名
  2. -p是一个定义并行化级别的选项。
  3. n是-p选项将为单词搜索创建的进程/线程数。
  4. word是我要寻找的词
  5. 正如您可以想象的那样,files是我将要搜索的文件。

我想用两种方式来做这件事,一种是用processes,另一种是用threads。最后,父进程/主线程返回它找到正在搜索的单词的行数。

问题是,我已经开发了一些代码,我撞到了墙。我不知道从这里往哪里走。

代码语言:javascript
复制
import argparse, os, sys, time

num_lines_with_pattern = []

def pattern_finder(pattern, file_searched):
    counter = 0
    with open(file_searched, 'r') as ficheiro_being_read:
        for line in ficheiro_being_read:
            if pattern in line:
                print line
                counter += 1
    num_lines_with_pattern.append(counter)

parser = argparse.ArgumentParser()
parser.add_argument('-p', type = int, default = 1, help = Defines command parallelization.')
args = parser.parse_args()
EN

回答 2

Stack Overflow用户

发布于 2015-11-07 20:26:49

下一步是导入threadingmultiprocessing,并按适当次数启动pattern_finder

您可能还想查看queue.Queue,这样您的结果就不会被打印得乱七八糟。

票数 0
EN

Stack Overflow用户

发布于 2015-11-07 22:28:33

问题可能是I/O绑定,因此引入多个线程/进程不会使硬盘工作得更快。

不过应该很容易查到。使用进程池运行pattern_finder()

代码语言:javascript
复制
#!/usr/bin/env python
from functools import partial
from multiprocessing import Pool, cpu_count

def pattern_finder(pattern, file_searched):
    ...
    return file_searched, number_of_lines_with_pattern

if __name__ == "__main__":
    pool = Pool(n or cpu_count() + 1) 
    search = partial(pattern_finder, word)
    for filename, count in pool.imap_unordered(search, files):
        print("Found {count} lines in {filename}".format(**vars()))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33582315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档