在MATLAB中搜索大型矩阵的更有效方法?
我有一个代码,可以做我想要的,但它太慢了,因为我有一个非常大的mat文件,其中有一个矩阵(33 GB),我需要搜索特定的值并提取它们 我正在搜索的文件具有以下结构:在MATLAB中搜索大型矩阵的更有效方法?,matlab,matrix,Matlab,Matrix,我有一个代码,可以做我想要的,但它太慢了,因为我有一个非常大的mat文件,其中有一个矩阵(33 GB),我需要搜索特定的值并提取它们 我正在搜索的文件具有以下结构: reporter sector partner year ave USA all CAN 2007 0.060026126 USA all CAN 2011 0.0637898418 ... 这种情况持续了数百万行。我想提取
reporter sector partner year ave
USA all CAN 2007 0.060026126
USA all CAN 2011 0.0637898418
...
这种情况持续了数百万行。我想提取特定报告者和合作伙伴的最后(第5)列值(部门和年份是固定的)。实际上,为了简单起见,我已经去掉了更多的固定值,但这可能会使我的代码更慢。country\u代码
和合作伙伴
值需要变化,因此循环
我的代码的关键部分如下:
for i = 1:length(country_codes)
for g = [1:length(partner)]
matrix(i,g) = big_file(...
ismember(GTAP_data(:,1), country_codes(i)) & ... % reporter
ismember(GTAP_data(:,2), 'all') & ...sector
ismember(GTAP_data(:,3), partner(g)) & ... partner
ismember([GTAP_data{:,4}]', 2011) & ... year
,5); % ave column
end
end
换句话说,代码遍历了数百万行,并通过在所有内容上应用逻辑&
的ismember
找到了正确的值
有没有比使用
ismember
更快的方法?有人能帮忙吗?所以我看到的是,您可以用不同文件中的数据构建一个大表
你的价值观似乎是基于文本的。这会占用更多的内存。“USA”已经占用了三个字节的内存。如果要concider的国家少于255个,则可以将它们存储为uint8格式的一个字节
如果可以将所有列存储为介于0和255之间的值,则可以生成一个uint8矩阵,该矩阵可以非常快速地编制索引
例如:
%demo
GTAP_regions={'USA','NL','USA','USA','NL','GB','NL','USA','Korea Republic of','GB','NL','USA','Korea Republic of'};
S=whos('GTAP_regions');
S.bytes
GTAP_区域
需要1580字节。现在我们转换它
GTAP_regions_list=GTAP_regions(1);
GTAP_regions_uint=uint8(1);
for ct = 2:length(GTAP_regions)
I=ismember(GTAP_regions_list,GTAP_regions(ct));
if ~any(I)
GTAP_regions_list(end+1)=GTAP_regions(ct);
else
GTAP_regions_uint(end+1)=uint8(find(I));
end
end
S=whos('GTAP_regions_list');
S.bytes
S=whos('GTAP_regions_uint');
S.bytes
GTAP\u regions\u uint
我们需要使用它来进行索引,现在它只有10个字节,分析速度非常快
GTAP\u regions\u list
我们需要用它来查找什么索引值属于哪个国家,只有496字节
您也可以针对部门、合作伙伴和年份执行此操作,具体取决于年份范围。如果它不超过255个不同的年份,它将起作用。否则,您可以将其存储为uint16,并有65535个可能的选项。所以我看到的是,您可以用不同文件中的数据构建一个大表 你的价值观似乎是基于文本的。这会占用更多的内存。“USA”已经占用了三个字节的内存。如果要concider的国家少于255个,则可以将它们存储为uint8格式的一个字节 如果可以将所有列存储为介于0和255之间的值,则可以生成一个uint8矩阵,该矩阵可以非常快速地编制索引 例如:
%demo
GTAP_regions={'USA','NL','USA','USA','NL','GB','NL','USA','Korea Republic of','GB','NL','USA','Korea Republic of'};
S=whos('GTAP_regions');
S.bytes
GTAP_区域
需要1580字节。现在我们转换它
GTAP_regions_list=GTAP_regions(1);
GTAP_regions_uint=uint8(1);
for ct = 2:length(GTAP_regions)
I=ismember(GTAP_regions_list,GTAP_regions(ct));
if ~any(I)
GTAP_regions_list(end+1)=GTAP_regions(ct);
else
GTAP_regions_uint(end+1)=uint8(find(I));
end
end
S=whos('GTAP_regions_list');
S.bytes
S=whos('GTAP_regions_uint');
S.bytes
GTAP\u regions\u uint
我们需要使用它来进行索引,现在它只有10个字节,分析速度非常快
GTAP\u regions\u list
我们需要用它来查找什么索引值属于哪个国家,只有496字节
您也可以针对部门、合作伙伴和年份执行此操作,具体取决于年份范围。如果它不超过255个不同的年份,它将起作用。否则,您可以将其存储为uint16,并有65535个可能的选项。1)您能否澄清一下运行代码所需的时间?你能以多快的速度从硬盘上读取数据?因为一般来说,500MB/s,33GB,打开文件大约需要一分钟。2) 你有33GB的可用内存吗?3) 您使用什么类型的matfile?(4、6、7或7.3)它是压缩的吗?1)代码大约需要一天才能完成。我正在Dell xps 15 9530上运行此功能。这是一个固态驱动器,所以它应该是相对快速,而不是可怕的瓶颈。2) 我有100 gb的可用磁盘空间。你认为这可能是问题所在吗?3) 我使用'-v7.3'和Matlab2014a。我想我设置了这个,这样它就可以处理这么大的文件。事实上,这可以达到500MB/s。您的函数
big_文件
不是matlab内置函数,对吗?也许这可以改进?big_文件正是我命名33 gb large matrix.Oke的方式,所以在这段代码之前,可能有类似于big_文件=matfile(文件名,'Writable',0)代码>?1)您能澄清一下运行代码atm所需的时间吗?你能以多快的速度从硬盘上读取数据?因为一般来说,500MB/s,33GB,打开文件大约需要一分钟。2) 你有33GB的可用内存吗?3) 您使用什么类型的matfile?(4、6、7或7.3)它是压缩的吗?1)代码大约需要一天才能完成。我正在Dell xps 15 9530上运行此功能。这是一个固态驱动器,所以它应该是相对快速,而不是可怕的瓶颈。2) 我有100 gb的可用磁盘空间。你认为这可能是问题所在吗?3) 我使用'-v7.3'和Matlab2014a。我想我设置了这个,这样它就可以处理这么大的文件。事实上,这可以达到500MB/s。您的函数big_文件
不是matlab内置函数,对吗?也许这可以改进?big_文件正是我命名33 gb large matrix.Oke的方式,所以在这段代码之前,可能有类似于big_文件=matfile(文件名,'Writable',0)代码>?