python多线程统计大文件字数并对返回值进行计算

large_txt_count.py

# _*_coding:utf-8_*_
import time
import threading
import configparser
import os
from datetime import datetime


class MyThread(threading.Thread):

    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
        self.result = None

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception as e:
            return None


def word_count(file, start, size):
    # print("移动的大小", size)
    words = {}
    # 分段时以 rb 形式打开,所以这里也要以rb打开,否则数据不对
    with open(file, 'rb') as fd:
        fd.seek(start, 0)
        # print("移动前位置", k)
        lines = fd.read(size)
        # 把 byte 转换成 string 指定编码格式
        lines = str(lines, encoding='gbk')
        for l in lines:
            for w in l:
                if w not in words:
                    words[w] = 1
                else:
                    words[w] += 1
        fd.close()
    return words


"""
tell():返回文件读取指针的位置
seek()的三种模式:(如果offset的值非零的时候,一定要以 b 的方式打开,否则则抛出 io.UnsupportedOperation 错误)
    (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置
    (2)f.seek(p,1)  移动到相对于当前位置之后的p个字节
    (3)f.seek(p,2)  移动到相对文章尾之后的p个字节
"""


def chunk_file(file, size=1024*1024*20):
    if not os.path.exists(file):
        exit("File not exists")
    else:
        size_count = os.path.getsize(file)
        with open(file, 'rb') as f:
            end = 0
            while True:
                start = end
                f.seek(size, 1)
                end = f.tell()
                yield start, end - start
                if end >= size_count:
                    break
            f.close()


if __name__ == '__main__':
    '''
    读取配置文件
    '''
    config = configparser.ConfigParser()
    config.read('conf.ini')
    # 文件名
    file_name = config.get('info', 'fileName')
    # 线程数量
    thread_num = int(config.get('info', 'threadNum'))
    # 起始时间
    start_time = datetime.now()
    t = []
    for start, size in chunk_file(file_name):
        th = MyThread(word_count, args=(file_name, start, size,))
        t.append(th)
        th.start()
        th.join()
    results = {}
    for k in t:
        k.join()
        result = k.get_result()
        for i, v in result.items():
            if i in results:
                results[i] += v
            else:
                results[i] = v
    print(results)
    end_time = datetime.now()
    print(end_time - start_time)

conf.ini

[info]
fileName=D:\files\projects\test\word_deal\result.txt
threadNum=5

结论:

测试 result.txt 文件410M ,电脑配置4核8G内存,消耗时间:92s

如果你也测试了,请在下方让我知道你的测试结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,多线程并不能直接返回值。因为线程是并行执行的,所以它们之间无法直接共享变量或返回值。如果你需要获取线程执行的结果,可以使用以下方法之一: 1. 使用共享变量:你可以在主线程中创建一个共享变量,在子线程中对其进行修改,并在主线程中等待子线程完成后获取该变量的值。这可以通过 `threading` 模块的 `Thread` 类和共享变量(如 `Queue`)实现。 下面是一个示例代码: ```python import threading def worker(result): # 在子线程中修改共享变量 result.append("Hello from worker") # 创建共享变量 result = [] # 创建线程对象 thread = threading.Thread(target=worker, args=(result,)) # 启动线程 thread.start() # 等待线程结束 thread.join() # 输出共享变量的值 print(result) ``` 2. 使用回调函数:你可以定义一个回调函数,将其作为参数传递给子线程,并在子线程中调用该回调函数来传递结果。这需要通过自定义的方式实现。 下面是一个示例代码: ```python import threading def worker(callback): result = "Hello from worker" callback(result) def on_result(result): print(result) # 创建线程对象,传递回调函数 thread = threading.Thread(target=worker, args=(on_result,)) # 启动线程 thread.start() # 等待线程结束 thread.join() ``` 请注意,在多线程编程中,对共享变量的访问需要进行适当的同步,以防止竞争条件和数据不一致的情况发生。可以使用锁(`Lock`)或其他同步机制来确保线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值