我有一个非常大且稀疏的矩阵,表示为CSV文件(67 GB)。
是否可以在Matlab中加载和使用此矩阵?我可以在MAC OS计算机上使用64位版本,8GB RAM。
我已经阅读了一些关于这个主题的帖子,但我仍然不确定Mac OS上的Matlab 64bit是否可以使用磁盘空间来分配矩阵或需要RAM中的所有内容,无论如何,如果使用如此大的部分磁盘空间可能使事情几乎无法使用。
答案 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
这样的高级命令以合理的方式处理这样一个巨大的文件
如果所有其他方法都失败了,只需找到一种方法在处理之前拆分文件。