【问题标题】:How to avoid reading a very large Array in Matlab multiple times?如何避免在 Matlab 中多次读取非常大的数组?
【发布时间】:2012-04-15 20:12:51
【问题描述】:

我有一个包含 5899091 行和 11 列的大型数组/矩阵。我将它存储在一个文本文件中。 在 matlab 中使用 dlmread() 方法,我每次需要它时都在阅读它。但是,这需要很多时间(超过 1 分钟)。我需要一次又一次地阅读文件。我陷入了这种情况。我的问题是:

1) 有没有办法只读取一次文件并将其保存在任何类型的全局/持久矩阵中?

2) 有没有更好的方法来读取文本文件并以更有效的方式将其转换为矩阵?

提前致谢。

【问题讨论】:

    标签: arrays matlab


    【解决方案1】:

    您可能会从内存映射文件中获得所需的性能。研究 Matlab 函数memmapfile。这不是我经常使用的东西,所以不会提供任何可能是错误的进一步建议。

    【讨论】:

      【解决方案2】:

      几乎可以肯定,最好的选择是在脚本或控制函数中简单地读取文件一次,然后将其作为变量传递给需要该数据的任何后续函数。这与添加全局声明一样多,而且更简洁、更易于维护和更灵活。

      您还可以将变量保存到 MAT 文件中。如果文件中的每个元素都是 double 类型,那么它的大小应该略高于 4GB。 MAT 格式很有效,但主要的好处是将数字存储为数字而不是文本。对于 5 位或 8 位有效数字,ASCII 中的相同数字分别占用 6.2 或 9.3 GB。

      如果出于某种原因您真的不想将数据作为变量传递,我建议使用嵌套函数而不是全局变量:

      function aResult = aFunction(var)
      
          data = dlmread(...);
      
          var4 = bFunction(var);
      
          function bResult = bFunction(var)
      
              var4 = cFunction(data);
      
          end
      
      end
      

      当然,此时您仍将业务功能包装在某些东西中。 scoping rules 很有帮助。

      现在,如果 真正的 问题只是这个文件的大小 - 也就是说,它对于内存来说太大了,并且您正在使用 dlmread 的范围参数来分块访问文件 - 那么您可能应该花时间到design a formatmemmapfile 一起使用。这个Wikipedia page 解释了潜在的好处。

      然后是brute force solution

      【讨论】:

      • 通过卓越的火力实现和平。我喜欢你的进取心。
      • 我以前受过伤。 (通过全局变量)。
      【解决方案3】:
      1. 您想使用全局变量。在函数顶部声明全局,它将被声明它的函数共享:参见http://www.mit.edu/people/abbe/matlab/globals.html
      2. 使用 .mat 文件。它会稍微快一点。此外,如果矩阵很容易创建(大单位矩阵或眼睛矩阵),则动态生成它可能会更快。最后,如果您的矩阵是稀疏的,请使用稀疏矩阵运算。

      【讨论】:

      • 我从没想过我会听到程序员说出“你想要你使用全局变量”这样的话。在这种情况下很好,但只需确保以只读方式使用全局变量。 ;)
      【解决方案4】:

      您可以读取该文件一次并将其保存到 MATLAB 的 MAT 文件中。然后,您可以使用MATFILE 直接从文件中完全或部分访问已保存的变量(基本上与 MATLAB 工作区中的任何变量一样)。我已经回答了一个类似的问题here。请看一下。

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 1970-01-01
        • 2016-11-09
        • 2019-10-06
        • 2011-06-06
        相关资源
        最近更新 更多