Python 多线程分块读文件

这里参考了这篇文章 https://gist.github.com/friskfly/4412375 ,然后加上自己的理解和应用, 整理如下: 


# -*- coding: utf-8 -*-
import os,time
import threading
import ConfigParser
rlock = threading.RLock()

curPosition = 0  #初始化位置为文件其实位置

class Reader(threading.Thread):
    def __init__(self, res):
        self.res = res
        super(Reader, self).__init__() #调用子类构造函数获得文件大小
    def run(self): #线程函数
        global curPosition
        fstream = open(self.res.fileName, 'r') #打开文件
        while True:
            rlock.acquire()
            startPosition = curPosition  #每次更新起始位置
            if(startPosition + self.res.fileSize/threadNum) < self.res.fileSize:   # 这里,例如开了10个线程,就将文件分为10块,每个线程负责一块
                curPosition = endPosition = (startPosition + self.res.fileSize/threadNum) 
            else:
                curPosition = endPosition = self.res.fileS
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个使用 Python 多线程分块处理 TIF 格式图像数据的示例代码: ```python import os import glob import threading import numpy as np from PIL import Image def process_chunk(chunk_path, output_path): """ 处理单个图像块的函数 """ # 加载图像块 img = Image.open(chunk_path) # 在这里可以对图像块进行各种处理操作 # ... # 保存处理后的图像块 img.save(output_path) def process_image(image_path, output_dir, chunk_size=512): """ 处理整张图像的函数 """ # 创建输出目录 os.makedirs(output_dir, exist_ok=True) # 加载整张图像 img = Image.open(image_path) width, height = img.size # 计算图像块数目 chunks_x = int(np.ceil(width / chunk_size)) chunks_y = int(np.ceil(height / chunk_size)) # 分块处理图像 for i in range(chunks_x): for j in range(chunks_y): # 计算当前块的位置和大小 x = i * chunk_size y = j * chunk_size w = min(chunk_size, width - x) h = min(chunk_size, height - y) # 构造图像块的路径和输出路径 chunk_path = f"{image_path}_{i}_{j}.tif" output_path = os.path.join(output_dir, f"{os.path.basename(image_path)}_{i}_{j}.tif") # 提取当前块并保存为 TIF 格式 img.crop((x, y, x + w, y + h)).save(chunk_path, format="TIFF") # 在新线程中处理当前块 t = threading.Thread(target=process_chunk, args=(chunk_path, output_path)) t.start() # 等待处理线程结束 t.join() # 删除临时文件 os.remove(chunk_path) if __name__ == "__main__": # 处理指定目录下的所有 TIF 格式图像 for image_path in glob.glob("path/to/images/*.tif"): process_image(image_path, "path/to/output") ``` 在这个示例代码中,我们使用 PIL 库来加载和处理图像数据,使用 numpy 库来计算图像块的数量和位置。我们首先定义了一个 `process_chunk` 函数来处理单个图像块,然后定义了一个 `process_image` 函数来处理整张图像。在 `process_image` 函数中,我们首先创建了输出目录,然后计算图像块的数量和位置,对每个图像块都创建一个新线程来处理它。在处理完每个图像块后,我们将其删除以释放磁盘空间。 请注意,这只是一个简单的示例代码,实际应用中还需要考虑诸如线程池大小、异常处理等问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值