Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取大型Matlab数据集子集_Matlab_Dataset_Subset - Fatal编程技术网

提取大型Matlab数据集子集

提取大型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,需

引用和分配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,需要大于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

  • 删除意味着数据集被复制,不需要的行被清除

行,subref,subref&ObsName=[],Delete,Delete&ObsName=[]

8000,4.19,2.06,4.81,4.72

32000,57.61,2.49,5.26,5.21

72000390.72,3.21,6.09,6.03

128000、(*)、4.21、7.25、7.19

(*)我放弃了评估这个值。根据对第^2行的线性推断,我猜是2000秒,或者半小时


脚本

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-会尝试一下。更一般地说,关于更好性能的替代结构的任何建议或建议?理论上你应该能够在唱矩阵和细胞阵列,只是有点尴尬。。