如何分块加载非常大的mat文件?

时间:2018-11-06 13:15:05

标签: python matlab numpy out-of-memory image-preprocessing

好的,所以代码是这样的 X1是已加载的高光谱图像,尺寸为(512x512x91) 我想要做的基本上是裁剪64x64x91大小的矩阵,步幅为2。这总共给我提供了49952张图像,每张64x64x91大小,但是当我运行for循环时,出现内存错误。 我的系统有8 GB的内存。

data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
    r=64
    print(k)
    for j in range (0,512-64,2):   
        #print(k)
        data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
        k=k+1

我有一个加载为Mat文件的高光谱图像,尺寸为(512x512x91)。我想使用此图像的大块作为CNN的输入,例如使用64x64x91的农作物。问题是,一旦我从原始图像中创建了农作物,就无法加载数据,因为一次加载所有农作物会给我带来内存错误。 我可以做一些事情来批量加载裁剪的数据,这样我就不会收到这样的内存错误。 我应该将数据转换为其他格式还是以其他方式解决问题?

3 个答案:

答案 0 :(得分:2)

您正在寻找matfile函数。它使您可以访问硬盘上的阵列,然后仅加载其中的一部分。

假设您的图片命名为pic,则可以执行类似的操作

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something

然后仅将变量(1:64,1:64,:)的{​​{1}}部分加载到pic中。

应始终注意,在硬盘上工作并非十分快,应避免。另一方面,如果您的变量太大而无法容纳在内存中,则没有其他解决方法(除了购买更多的内存)。

答案 1 :(得分:0)

我想您可能想使用matfile函数,该函数基本上是打开.mat文件而不将其全部内容拉入RAM的。您基本上是从.mat文件中读取一个标头,该标头包含有关存储的元素的信息,例如大小,数据类型等。想象一下您的.mat文件 hyperspectralimg.mat 包含矩阵 myImage 。您必须这样进行:

filename = 'hyperspectralimg.mat';
img = matfile(filename);

A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts

img.myImage(1:64,1:64,:) = A; %Return changes to your file

这是一个简短的示例,以防万一您以前没有使用过matfile的情况。如果您已经使用过它,但是它不起作用,请告诉我们,并作为一般建议,上载有关您的问题的代码段和数据示例,这会有所帮助。

关于标签的快速评论:如果您的关注点是matlab,则不要标记python和类似的东西。

答案 2 :(得分:0)

您可以使用numpy内存映射。这等效于MatLAB的matfile。

https://numpy.org/doc/stable/reference/generated/numpy.memmap.html