如何在MATLAB中加载大文件(~150MB)?

时间:2012-02-03 19:01:38

标签: matlab memory file-io mat-file

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

3 个答案:

答案 0 :(得分:11)

发布R2011b(版本7.13)中的

Starting有一个新对象matlab.io.MatFileMATFILE作为构造函数。它允许在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

我现在没有最新版本进行测试,但希望它能够正常运行。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

您还可以使用MATLAB的Memory-Mapping of Data Files读取文件块,处理它,然后继续执行下一个块,而不必一次将整个文件加载到内存中。

例如,请参阅this example,其中“将100个双精度浮点数的文件映射到内存。”