导入大矩阵:是整体导入还是逐列导入?- MATLAB

4

这是一个普遍的编程问题,但对于Matlab可能有特殊考虑。

我将要导入非常大的数据文件。把整个文件导入内存然后将其分成子矩阵更好/更快/更有效呢?还是只是将每个n列导入新矩阵中?

我猜把它全部加载到缓存中然后再处理会更快,但这只是一个不专业的猜测。


你的数据文件是什么格式?它是文本文件、ASCII分隔数字文件还是CSV文件?MATLAB内置了几种专门处理不同数据类型的处理程序,这些程序使用类似于C语言的语法,即打开文件流、从文件流中读取数据,最后关闭文件流。我认为其中之一会是你最好的选择。 - Engineero
你能具体说明一下你将如何处理这个矩阵吗?如果目标只是将矩阵加载到内存中,之后没有任何计算,我看不出有任何理由利用缓存。 - Da Kuang
1
大框架:将会有大量的矩阵操作和乘法。我猜测最有效的方法是甚至不要将大矩阵分割,而是在计算中使用它的子集(例如 resultingMatrix = data(:,1:n) .* data(:,n+1:2*n) ,但这会使代码对其他人来说难以理解)。 - msmf14
1
尽可能以最简单和易读的方式编写代码。如果数据可以轻松地适应主内存,那么你就没问题了。如果不能,你就需要更好的磁盘存储格式(二进制)和分块算法来批处理数据。你绝对不想多次解析CSV文件中的每一行,这是通过按列分块实现的。 - Peter
首先,使用textscan导入.csv文件。其次,您可能需要采用块导入的方式,即行块而不是列块。此外,根据我的经验,我注意到块大小很重要,最大的不一定是最快的。 - Oleg
显示剩余2条评论
1个回答

1

根据我的经验,最好的方法是使用csvread(它使用dlmread,而dlmread使用textscan - 因此时间惩罚不显着)来解析一次。当然,前提是一个非常大的文件不会比你拥有的免费RAM更大。如果一个非常大的文件大于RAM(例如,我刚刚不得不解析一个31GB的文件),那么我会使用fopen,逐行读取(或块,块等),并将这些写入可写的mat文件中。这样,在理论上,您可以编写受文件系统限制的巨大文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接