搜索txt/bin/etc文件以获取比指定值大的数字数据的最快方法



我在标有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的当前版本中可能很快。

最新更新