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

Posted

技术标签:

【中文标题】如何在 MATLAB 中加载大文件(~150MB)?【英文标题】:How can I load large files (~150MB) in MATLAB? 【发布时间】:2012-02-26 09:19:31 【问题描述】:

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

【问题讨论】:

是 *.mat 文件格式,还是其他格式? 我很惊讶一个150mb的文件打开时会填满2GB的内存!在您尝试加载之前,您的机器有多少可用内存?还有其他可以关闭的程序吗? 如果这是一个 .mat 文件,whos -file <file> 是否也会导致问题,或者只是load?如果不是 .mat 文件,是否有标题文本? 【参考方案1】:

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

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

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

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

【讨论】:

XML DOM 首先将整个文件读入内存,所以这里对你没有帮助; SAX 流式传输 XML 并引发事件以处理数据。另外,我发现在 MATLAB 中处理 DOM 对象很慢。 @Nzbuu,谢谢。出于某种原因,我认为 Matlab 总是使用 SAX。快速谷歌搜索显示您是正确的。 我认为它使用 SAX 创建 DOM 树。【参考方案2】:

Starting 从 R2011b (ver.7.13) 版本开始,有一个新对象 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

我现在没有要测试的最新版本,但希望它能正常工作。

【讨论】:

【参考方案3】:

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

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

【讨论】:

我在早期版本中尝试过这个对象,当时它刚刚出现在 MATLAB 中。有趣的是,MATLAB 不得不将整个文件加载到内存中。我联系了 Mathworks 支持,他们确认了这一点。他们基本上将此功能推广为能够同时在不同应用程序之间共享数据的能力。嗯,看起来事情已经改变了。我用 R2011a 再次尝试过,memmapfile 对象只占用 300b。不错的答案。 +1。该文件必须具有此对象的常规结构(仅限二进制?),因此输入文件可能无论如何都需要重新格式化。

以上是关于如何在 MATLAB 中加载大文件(~150MB)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中加载大的 .mat 文件?

如何在 Qt 中从 txt 文件中加载大数据

如何在 R 中加载大数据? [复制]

如何在unity3d中加载大工程模型

在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?

在Android中加载大文本