9

我有一个矩阵形式的大型 MATLAB 文件(150MB)(即 4070x4070)。我需要在 MATLAB 中处理这个文件,但我似乎无法加载这个文件。我收到“内存不足”错误。有没有其他方法可以加载这种大小的文件?我使用的是 32 位处理器并有 2GB 的 RAM。请帮助我,我处理这个问题已经筋疲力尽了。

4

3 回答 3

11

版本 R2011b (ver.7.13) 开始,有一个新对象matlab.io.MatFile使用MATFILE作为构造函数。它允许在 MAT 文件中加载和保存部分变量。有关更多详细信息,请参阅文档。这是一个读取部分矩阵的简单示例:

matObj = matfile(filename);
a = matObj.a(100:500, 200:600);

如果您的原始文件不是 MAT 文件,而是某个文本文件,您可以部分读取它并使用matfile将这些部分保存到 MAT 文件中的同一变量中以供以后访问。只需记住Writable在构造函数中将属性设置为 true。

假设您的文本文件是制表符分隔的并且只包含数字,下面是一个示例脚本,用于按块读取数据并将它们保存到 MAT 文件:

blocksize = 100;
startrow = 0;
filename = 'test.mat';
matObj = matfile(filename,'Writable',true);
while true
    try
        a = dlmread(filename,'\t',startrow,0); %# depends on your file format
        startrow = startrow + blocksize;
        matObj.a(startrow+(1:blocksize),:) = a;
    catch
        break
    end
end

我现在没有要测试的最新版本,但希望它应该可以工作。

于 2012-02-03T20:53:28.967 回答
3

如果它是一个图像文件,并且您想使用它,请尝试matlab 块处理。通过使用它,您将加载文件的一小部分。您的函数fun将单独应用于每个块。

 B = blockproc(src_filename,[M N],fun)

如果它是一个xml文件,请与 - 一起尝试该XML DOM Node模式SAX(感谢@Nzbuu 指出这一点),但这似乎是一个未记录的功能。

此外,如果它是任何类型的文本文件(不太可能,由于数据量),请尝试使用外部工具进行拆分。

于 2012-02-03T19:07:56.437 回答
1

您还可以使用 MATLAB 的数据文件内存映射来读入文件的一个块,对其进行处理,然后继续下一个块,而无需一次将整个文件加载到内存中。

例如,参见这个例子,它“将一个包含 100 个双精度浮点数的文件映射到内存”。

于 2012-02-06T18:09:38.340 回答