任何加速从磁盘读取数据并将其转换为numpy数组以进行进一步处理的解决方案?

时间:2014-02-28 05:31:06

标签: python numpy scipy multiprocessing gdal

是否有任何解决方案可以加速从磁盘读取栅格数据并将其转换为numpy数组以进行进一步处理?我真的很累,因为以下代码需要花费数天的时间来阅读(并转换成numpy数组)数千个文件。

import glob, gdal, numpy as np
tiff_files = glob.glob('*.tif')    
all_data = []
for f in tiff_files:
    data_open = gdal.Open(f)
    data_array = data_open.ReadAsArray().astype(np.float32) 
    all_data.append(data_array)

如何对上述情况应用多处理?

1 个答案:

答案 0 :(得分:1)

这并不难,因为你的tiff_files已经是一个列表,一个重要的问题是命令是否重要 - 结果必须与原始文件的顺序相同。如果不是

from multiprocessing import Pool
from multiprocessing import cpu_count


def handle_tiff(some_file):
    data_open = gdal.Open(some_file)
    data_array = data_open.ReadAsArray().astype(np.float32) 
    return data_array

tiff_files = glob.glob('*.tif') 
p = Pool(cpu_count()- an_integer)
all_data = p.map(handle_tiff, tiff_files)

在上面的代码中,您只需使用cpu_count而不减去整数。

在回答您的问题时,some_file是列表tiff_files的路径。请注意,p.map将列表tiff_files中的每个项目映射到函数handle_tiff并生成一些线程。该列表分为不连续的块,每个块分配给不同的线程。然后,每个块中的文件路径按顺序提交给函数。