在Matlab中处理一个非常大且稀疏的矩阵

时间:2014-07-16 20:01:52

标签: macos matlab matrix sparse-matrix

我有一个非常大且稀疏的矩阵,表示为CSV文件(67 GB)。

是否可以在Matlab中加载和使用此矩阵?我可以在MAC OS计算机上使用64位版本,8GB RAM。

我已经阅读了一些关于这个主题的帖子,但我仍然不确定Mac OS上的Matlab 64bit是否可以使用磁盘空间来分配矩阵或需要RAM中的所有内容,无论如何,如果使用如此大的部分磁盘空间可能使事情几乎无法使用。

2 个答案:

答案 0 :(得分:1)

听起来内存映射就是您的解决方案!

http://www.mathworks.nl/help/matlab/memory-mapping.html

从本质上讲,您可以映射文件的位置,以便您可以按部件访问它(一种索引,但我想在您的硬盘上)。完成后,根据矩阵的稀疏性(稀疏性?),您可能希望切换到稀疏矩阵,这有望适合您的RAM,这样您就可以利用RAM的速度,不再局限于HDD速度。

另一种解决方案是逐行读取文件(或其他分隔数量),并将非零值仅放在稀疏矩阵中。

http://www.mathworks.nl/help/matlab/ref/fgetl.html

http://www.mathworks.nl/help/matlab/ref/sparse.html

亲切的问候,

Ernst Jan

好的,所以当使用fgetl解决方案时,我获得了合理的性能。约。我的笔记本电脑每100行10个。

% Start with a clean slate.
clear all
% Create a data file, large!
m = 100; % Rows
n = 230000; % Columns
max_x = 10000;
X=randi(max_x,m,n); 
% Create lots of zeros by setting everything smaller 0.999 x_max to 0;
X(X<0.999*max_x)=0;
% Write data file
csvwrite('csvlist.dat',X);

% Now create a sparse matrix to put the csv file in:
P = sparse(m,n);

% Open data file
FID=fopen('csvlist.dat','r');
% Set line number counter to 0
line_number = 0;
% Get the first line of the data file (230K numbers)
text_line = fgetl(FID);
    % If a text line has been retrieved from the line keep looping!
    tic
    while ischar(text_line)
        % Increase to line_number with 1 (MATLAB index starts at 1..)
        line_number = line_number+1;
        % Analyse the first text line (I assume all integers, otherwise change the format %d to %f)
        C = textscan(text_line,'%d','delimiter',',','EmptyValue', 0);
        % Now the number are stored in cell C. Which we should put in the
        % sparse matrix:
        P(line_number,:)=C{1}; % Can be optimized but forgot how but fast enough for now!
        % And let's get the next line!
        text_line = fgetl(FID);
    end
    toc
    fclose(FID);

所以230k线应该需要大约5到10个小时。

亲切的问候,

Ernst Jan

答案 1 :(得分:0)

基于this link我会说matlab肯定可以保存大多数计算机上存储在矩阵中的数据量。 (你所描述的矩阵甚至应该适合RAM我猜)。要查找计算机的限制,请使用memory命令。

话虽这么说,创建这个矩阵的难点在于读取文件。正如@ EJG89的回答中提到的那样,您可能需要使用fgetl的逐行方法,因为我不希望像dlmread这样的高级命令以合理的方式处理这样一个巨大的文件

如果所有其他方法都失败了,只需找到一种方法在处理之前拆分文件。