我在一个标记为r的结构下的matfile中保存了37,000,000x1双数组。我可以使用matfile(...)指向此文件,然后使用find(...)命令查找高于阈值val的所有值
这会查找大于/等于0.004的所有值,但考虑到我的数据大小,这需要一些时间。
我想减少时间并且考虑使用bin文件(显然它们在不丢失精度方面比txt文件更好?)等,但是我不能用语法/方法知道
我已设法将数据保存到bin文件中,但是搜索这个大文件的最快方式是什么? 我想要的唯一输出数据是实际值大于我指定的值。
最好使用bin文件吗?还是一个matfile?等
我不想将整个文件加载到matlab中。我想节省matlab内存,因为其他程序可能需要空间而我不想再次出现内存错误
答案 0 :(得分:1)
正如@OlegKomarov指出的那样,一个37,000,000元素的双打阵列并不是很大。您真正的问题可能是您没有足够的RAM和/或使用32位版本的Matlab。 find
函数将需要额外的内存用于输入和out数组索引。
如果要以块的形式加载和处理数据,可以使用matfile
功能。这是一个小例子:
fname = [tempname '.mat']; % Use temp directory file for example
matObj = matfile(fname,'Writable',true); % Create MAT-file
matObj.r = rand(37e4,1e2); % Write random date to r variable in file
szR = size(matObj,'r'); % Get dimensions of r variable in file
idx = [];
for i = 1:szR(2)
idx = [idx;find(matObj.r(:,i)>0.999)]; % Find indices of r greater than 0.999
end
delete(fname); % Delete example file
这样可以节省内存,但绝对不会比将所有内容存储在内存中并调用find
一次更快。文件访问总是较慢(尽管如果你有SSD,它会有所帮助)。上面的代码使用idx
变量的动态内存分配,但内存只在大块中重新分配了几次,在当前版本的Matlab中可能非常快。