如何避免多次在Matlab中读取一个非常大的数组?

时间:2012-04-02 06:37:36

标签: arrays matlab

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

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

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

提前致谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

您也可以将变量保存到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

答案 2 :(得分:0)

  1. 您想使用全局变量。在函数顶部声明全局,它将由声明它的函数共享:参见http://www.mit.edu/people/abbe/matlab/globals.html
  2. 使用.mat文件。它会稍快一些。此外,如果矩阵易于创建(大型标识或眼睛矩阵),则可以更快地生成它。最后,如果您的矩阵是稀疏的,请使用稀疏矩阵运算。

答案 3 :(得分:0)

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