在MATLAB中搜索大型矩阵的更有效方法?

在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 ... 这种情况持续了数百万行。我想提取

我有一个代码,可以做我想要的,但它太慢了,因为我有一个非常大的mat文件,其中有一个矩阵(33 GB),我需要搜索特定的值并提取它们

我正在搜索的文件具有以下结构:

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)