一个python文件 多个进程 python多进程读同一个文件 您所在的位置:网站首页 一个线程可以属于多个进程 一个python文件 多个进程 python多进程读同一个文件

一个python文件 多个进程 python多进程读同一个文件

2023-05-30 08:21| 来源: 网络整理| 查看: 265

分析结论

多进程可以实现逐行遍历同一个文件(可以保证每一个进程遍历的行都是完整且互不重复的),且可以提高遍历性能。

多进程 / 多线程遍历文件速度单进程、多线程读取同一个文件时,每个线程的运行时间并不能随线程数的增加的降低;多进程读取同一个文件时,每个进程的运行时间随线程数的增加而降低。进一步优化方法

通过统计读取到的字符串长度,计算当前文件指针位置,从而避免在每次遍历中均需使用 file.tell() 获取当前文件指针位置。

分析过程

构造 11202 MB、691130 行的测试数据。具体测试数据特征如下:

文件大小:11746098941 Bytes(11202 MB)行数:691130import time1. 单进程、单线程遍历文件t1 = time.time() with open(path, "r", encoding="UTF-8") as file: for _ in file: pass t2 = time.time() print(t2 - t1)

运行时间:21.79 秒(三次测试 23.55、20.84、21.00 取平均值)

2. 多线程遍历文件import os from theading import Thread

定义每个线程 / 进程的遍历函数如下:通过捕获 UnicodeDecodeError 异常,避免出现刚好切分到半个字的情况;通过在遍历前先 file.readline(),使每一个切分点中尚未结束的行一定归属上一进程 / 线程而不是下一进程 / 线程,从而保证每一个进程 / 线程遍历的每一行都是完整且互不重复的。

def read(path, start, end): """每个进程 / 线程的遍历函数 Parameters ---------- path : str 文件路径 start : int 本分块的开始位置 end : int 本分块的结束位置 """ cnt = 0 with open(path, "r", encoding="UTF-8") as file: file.seek(start) # 移动到目标位置 if start != 0: while True: try: file.readline() # 跳过当前行(所有未遍历完的行属于上一段) break except UnicodeDecodeError: # 刚好切分到半个字,向后移动一个字符 file.seek(start + 1) while file.tell()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有