多进程比较多个 .txt 文件中的字符串?

Posted

技术标签:

【中文标题】多进程比较多个 .txt 文件中的字符串?【英文标题】:Multiprocess to compare strings in multi .txt files? 【发布时间】:2021-07-06 18:39:39 【问题描述】:

我有几个 txt 文件,每个文件大约有一百万行,搜索等式大约需要一分钟。文件保存为 0.txt、1.txt、2.txt、...为方便起见,in_1 和 searchType 是用户给定的输入。

class ResearchManager():
def __init__(self,searchType,in_1,file):
    self.file = file
    self.searchType = searchType
    self.in_1 = in_1
    
def Search(self):
    
    current_db = open(str(self.file) + ".txt",'r')
    .
    .
    .

    #Current file processing


if __name__ == '__main__':

n_file = 35
for number in range(n_file):
    RM = ResearchManager(input_n, input_1, number)
    RM.Search()

我想使用多处理优化搜索过程,但没有成功。有没有办法做到这一点?谢谢。

编辑。

我能够以这种方式使用线程:

class ResearchManager(threading.Thread):
def __init__(self, searchType, in_1, file):
    threading.Thread.__init__(self)
    self.file = file
    self.searchType = searchType
    self.in_1 = in_1
    
def run(self):
current_db = open(str(self.file) + ".txt",'r')
.
.
.

#Current file processing

...

        threads=[]
        for number in range(n_file+1):
            
            threads.append(ResearchManager(input_n,input_1,number))

        start=time.time()
        
        for t in threads:
            t.start()
            
        for t in threads:
            t.join()
        end=time.time()

但是总执行时间比正常的for循环还要长几秒。

【问题讨论】:

你可以先用 ThreadPoolExecutor 实现代码。并稍后更改为 ProcessPoolExecuter。如果在转换中出现任何错误,很可能是由于酸洗对象,需要重构。确保提交给 ProcessPoolExecutor 的任务和参数都是可挑选的,避免文件对象、lambda/嵌套函数等。 我试图改编 here 所说的话。谢谢你的建议,我去看看。 multiprocessing.dummy.ThreadPoolmultiprocessing.Pool 的基于线程的直接替换。 【参考方案1】:

你能展示你在线程方面的尝试吗?看看这篇文章,它很好地提供了对 python 线程如何工作的基本理解。

https://realpython.com/intro-to-python-threading/

import logging
import threading
import time

def thread_function(name):
    logging.info("Thread %s: starting", name)
    time.sleep(2)
    logging.info("Thread %s: finishing", name)

if __name__ == "__main__":
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO,
                        datefmt="%H:%M:%S")

    threads = list()
    for index in range(3):
        logging.info("Main    : create and start thread %d.", index)
        x = threading.Thread(target=thread_function, args=(index,))
        threads.append(x)
        x.start()

    for index, thread in enumerate(threads):
        logging.info("Main    : before joining thread %d.", index)
        thread.join()
        logging.info("Main    : thread %d done", index)

【讨论】:

GIL 将阻止线程的真正性能提升。 我也是新手,正在学习。您介意详细说明,而这会妨碍性能提升吗?

以上是关于多进程比较多个 .txt 文件中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较

如何更改多个 .txt 文件中的字符并保存/覆盖 Powershell 中的现有文件

如何将新字符串名称与 txt 文件中的现有字符串名称进行比较?

python中怎么比较文件名字符与文件指定位置内容字符是不是一致?

多线程与多进程的比较

解析时忽略txt文件中的某些行