我有一个代码可以做我想要的但是它太慢了,因为我有一个非常大的mat文件和一个矩阵(33千兆字节),我需要搜索特定值并提取它们。
我正在搜索的文件具有以下结构:
reporter sector partner year ave
USA all CAN 2007 0.060026126
USA all CAN 2011 0.0637898418
...
这会持续数百万行。我想提取特定报告者的最后一个(第5个)列值和partner
值(扇区和年份是固定的)。实际上,为了简单起见,我已经采用了更多的固定值,但这可能会使我的代码更慢。由于这个原因,country_codes
和partner
值需要变化并循环。
我的代码的关键部分如下:
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
更快的方法?有人可以帮忙吗?
答案 0 :(得分:0)
所以我看到的是你用不同文件中的数据构建一个大表。
您的值似乎是基于文本的。这会占用更多内存。 “USA”已经占用了三个字节的内存。如果你有少于255个国家的concider,你可以将它们只存储为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_regions
需要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_regions_uint
我们需要用来做索引,现在只有10个字节,分析速度非常快。
GTAP_regions_list
我们需要用来查找哪个索引值属于哪个国家,只有496个字节。
您还可以根据年份范围为行业,合作伙伴和年份执行此操作。如果它不超过255年,它将起作用。否则,您可以将其存储为uint16并具有65535个可能的选项。