提取大型Matlab数据集子集
引用和分配matlab数据集的子集似乎效率极低,可能会像第^2行那样扩展 示例: alldata是一个混合数据的大型数据集,比如150000行乘25列(整数、布尔值和字符串) 数据集的格式为:提取大型Matlab数据集子集,matlab,dataset,subset,Matlab,Dataset,Subset,引用和分配matlab数据集的子集似乎效率极低,可能会像第^2行那样扩展 示例: alldata是一个混合数据的大型数据集,比如150000行乘25列(整数、布尔值和字符串) 数据集的格式为: 'format', '%s%u%u%u%u%u%s%s%s%s%s%s%s%u%u%u%u%s%u%s%s%u%s%s%s%s%u%s%u%s%s%s%u%s' 然后,我将2个整型col转换为boolean类型 以下子集赋值: somedata = alldata(1:m,:) 对于m=10000,需
'format', '%s%u%u%u%u%u%s%s%s%s%s%s%s%u%u%u%u%s%u%s%s%u%s%s%s%s%u%s%u%s%s%s%u%s'
然后,我将2个整型col转换为boolean类型
以下子集赋值:
somedata = alldata(1:m,:)
对于m=10000,需要大于7秒的时间;对于m的较大值,则需要荒谬的时间。绘图时间vs m显示了一个m^2类型的关系,这很奇怪,因为复制所有数据几乎是瞬时的,就像使用sortrows和find这样的函数一样。事实上,在中读取原始.csv数据文件的速度比上面分配的大值m要快
使用探查器,似乎有一个函数subref,其中包含一个非常慢的行,用于检查字符串比较以确定数据集中的唯一值。这是否与数据集类型的存储方式(即参考表)有关?数据集包含大量唯一的字符串值
他们是否有在matlab中提取数据集子集的解决方案?例如预分配(如何?),或者复制数据集并删除行,而不是分配提取/子集
我使用的是具有1.5Gb ram的双核机器,但task manager报告使用的ram不足1Gb。我以前使用过MATLAB的大数据阵列,不幸的是,它们确实存在性能问题。我发现有一件事有助于加快速度,那就是清理财产 请尝试以下修复程序:
%# I assume you have a 'dataset' object
ds = dataset(...);
%# clear the observation names property (It simply a label for each record)
ds.Properties.ObsNames = [];
Amro建议清除观察名称:
ds.Properties.ObsNames = [];
这将带来巨大的性能好处,因为子集分配从二次型(针对行^2绘制时为线性)更改为线性型(针对行绘制时为线性),而行的损失较小
复制数据集几乎是瞬时的,因此,当与清除不需要的行相结合时,也会带来巨大的性能改进,尽管这是一个稍微不太理想的解决方案(但不会丢失obsname)。与删除OBS名称相比,性能大约慢2倍。当ObsNames也被删除时,这只会提高2%
支持数据 我使用一个小脚本来分配150000x25混合字符串/整数/布尔数据集的子集行,该数据集生成以下时间度量(秒) 内存堆大小在性能上没有显著差异,保持在128 MB Subref表示使用了用于子集赋值的标准函数
- ObsNames=[]表示删除ObsNames
- 删除意味着数据集被复制,不需要的行被清除
脚本
clear
load('data'); % load 'alldata' dataset
% alldata.Properties.ObsNames = []; % drop obsnames
tic;
x = ((1:4).^2.*8000);
for h = 1:length(x)
start = toc;
somedata = alldata(1:x(h),:);
% somedata = alldata;
% somedata(x(h):end,:) = []; % drop unrequired obs
t(h) = toc - start;
clear somedata
disp([x(h), t(h)]);
end
您能给我们一个数据库的快照示例吗?只要几行和所有列就可以了。嗯-数据是。。。敏感的它主要由一个观察id、几个作为字符串保存的引用id、几个日期字段(存储在字符串中,因为我还没有准备好使用它们)、两个布尔列、几个整数字段(大多数是单个整数)和一大堆其他字符串字段组成(通常少于20-30个字符。如果有帮助的话,我可以给你变量类型的实际序列?这里有一个其他人有同样问题的例子:谢谢Amro-会尝试一下。更一般地说,关于更好性能的替代结构的任何建议或建议?理论上你应该能够在唱矩阵和细胞阵列,只是有点尴尬。。