【问题标题】:Matlab not able to read in large file?Matlab无法读取大文件?
【发布时间】:2015-09-02 00:27:37
【问题描述】:

我尝试在 MATLAB 中处理一个数据文件 (6.3GB),但无法加载它,我认为这可能是内存问题。我尝试加载一个较小的“示例”文件(39MB),这似乎可行,但我的实际文件根本不会加载。这是我的代码:

filename = 'C://Users/Andrew/Documents/filename.mat';
load(filename);

??? Error using ==> load
Can't read file C://Users/Andrew/Documents/filename.mat.

exist(filename);
EDU>> ans = 2

好吧,至少文件存在。当我检查内存时...

memory
Maximum possible array:            2046 MB (2.146e+009 bytes) *
Memory available for all arrays:   3442 MB (3.609e+009 bytes) **
Memory used by MATLAB:              296 MB (3.103e+008 bytes)
Physical Memory (RAM):             8175 MB (8.572e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.

既然我有足够的 RAM,我是否需要增加最大可能的数组大小?如果是这样,我该如何在不增加更多 RAM 的情况下做到这一点?

系统细节:我正在运行 64 位 Windows、8GB RAM、MATLAB 版本 7.10.0.499 (R2010a)。我想我不能更新到更新的版本,因为我持有的是学生许可证。

【问题讨论】:

  • 很遗憾,您不能增加最大可能数组。这意味着在您的情况下,无法加载超过 2046Mb 的单个变量。我认为可行的唯一选择是分段加载,因为您最多可以加载8175Mb 的数据。这并不完全正确,因为您需要 RAM 内存来运行 Matlab、Windows 等,但您知道了。

标签: matlab memory


【解决方案1】:

也许您可以使用load part of variables from mat file 部分加载您的数据以完成您的工作。您必须拥有 matlab 7.3 或更高版本。

【讨论】:

    【解决方案2】:

    一种选择是使用 matfile 对象直接加载/索引到文件中,而不是加载到内存中。

    doc matfile
    

    但一个限制是您不能直接索引到结构中。所以你需要找一个朋友来转换你的mat文件中的结构并使用版本选项保存它

    save(filename, variables, '-v7.3')
    

    【讨论】:

      【解决方案3】:

      从您的文件路径中,我可以看到您使用的是 Windows。 Matlab 在 Windows 和 Linux 上只有 32 位(这些操作系统没有 64 位至少对于旧版本,请参阅我的编辑),这意味着您的单个内存限制为

      从内存输出中可以看出,矩阵存储总共只能有约 3.4GB,这远小于 6.3GB 文件。您还会注意到,对于一个特定的矩阵,您只能使用 ~2GB(该数字会随着您使用更多内存而变化)。

      通常在处理大文件时,您可以逐行读取文件,而不是将整个文件加载到内存中。但由于这是一个可能无法工作的.mat 文件。如果文件包含多个变量,则可以将它们分别分成各自的文件,这些文件小到可以加载

      这里的关键信息是,除非您使用具有足够 RAM 的 Mac,否则您无法一次读取整个文件。即使这样,单个矩阵的大小仍然可能小于 6.3GB

      编辑

      当前的 Matlab student 版本可以购买 64 位,适用于 2014 年的所有操作系统 see here,因此较新版本的 Matlab可能允许您阅读整个文件立刻。我还应该补充一点,2014 年之前有一个 64 位版本,但不适用于学生许可证

      【讨论】:

      • 自 R2006 以来,Matlab 已经有了适用于 Windows 和 Linux 的 64 位版本; Mac 的 64 位版本直到 R2009 左右才出现。带回家的信息是他需要掌握 64 位 Matlab,而不是切换整个操作系统。
      • @Setsu 你是对的,如果你看我的编辑,我忘了提到 64 位直到最近才适用于学生许可证(Mac 和 2013 年显然是 linux 除外)
      【解决方案4】:

      由于大小可能是问题,您可以尝试load('fileName.mat', 'var1'); load('fileName.mat', 'var2'); 等。为此,您必须知道变量名称。

      【讨论】:

      • 不幸的是,我不知道变量名称,而且我对它们命名的猜测似乎不正确。不过,如果迫在眉睫,我可以尝试追踪创建文件的人并询问他们。
      • 好消息:我知道变量名是什么了。坏消息:该文件是 1x1 结构,所以看起来我不能一次只加载其中的一部分。
      • '使用 load('fileName.mat', 'a*');'将读取所有以 a 开头的变量,这样,您可能分 26 步完成(假设它们都以 a-z 开头)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多