一个python文件 多个进程 python多进程读同一个文件 | 您所在的位置:网站首页 › 一个线程可以属于多个进程 › 一个python文件 多个进程 python多进程读同一个文件 |
分析结论 多进程可以实现逐行遍历同一个文件(可以保证每一个进程遍历的行都是完整且互不重复的),且可以提高遍历性能。 多进程 / 多线程遍历文件速度单进程、多线程读取同一个文件时,每个线程的运行时间并不能随线程数的增加的降低;多进程读取同一个文件时,每个进程的运行时间随线程数的增加而降低。进一步优化方法通过统计读取到的字符串长度,计算当前文件指针位置,从而避免在每次遍历中均需使用 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 实验室设备网 版权所有 |