Python 有什么解决方案可以加速从磁盘读取数据并将其转换为numpy阵列进行进一步处理?

Python 有什么解决方案可以加速从磁盘读取数据并将其转换为numpy阵列进行进一步处理?,python,numpy,scipy,multiprocessing,gdal,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.ReadAsA

是否有任何解决方案可以加速从磁盘读取光栅数据并将其转换为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)

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

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

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_计数而不减去整数


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

感谢您的努力。是的,顺序无关紧要。因此,我将测试您的代码。请注意,如果您的I/O受到严重限制,多处理可能不会显著提高速度(甚至可能降低速度)——如果是这样,请将数据分布到多个磁盘轴和/或更快的磁盘上。@PyNEwbie顺便问一句,您在定义某个_文件后在哪里使用了它。tiff_文件后是否需要for循环?能否提供更多上下文?图像有多大?在你读了这些数据之后,你在用它们做什么?为什么你要一次读一个,而不是一次读一个呢?看看肖恩·吉尔斯的rasterio:它应该比你现在把每个geotiff读入一个numpy数组的方式更有效率。