我在标有r的结构下保存了一个37,000,000x1的双阵列。我可以使用Matfile(...)指向此文件,然后只使用Find(...)命令查找阈值val的所有值
这找到了大于/等于0.004的所有值,但考虑到我的数据的大小,这需要一些时间。
我想减少时间并考虑使用bin文件(显然它们比失去精确度要好于TXT文件?)
我设法将数据保存到bin文件中,但是最快搜索这个大文件的方法是什么?我想要的唯一输出数据实际上值大于我指定的值。
使用垃圾箱文件最好?还是矩阵?等
我不想将整个文件加载到MATLAB中。我想节省MATLAB内存,因为其他程序可能需要该空间,并且我不想再次记忆错误
正如@olegkomarov指出的那样,一个37,000,000个元素的双重阵列不是很大。您的真正问题可能是您没有足够的RAM和/或使用32位版本的MATLAB。find
功能将需要输入和输出索引阵列的其他内存。
如果要在块中加载和处理数据,则可以使用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的当前版本中可能很快。