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

时间:2015-05-05 21:59:51

标签: matlab file search

我在一个标记为r的结构下的matfile中保存了37,000,000x1双数组。我可以使用matfile(...)指向此文件,然后使用find(...)命令查找高于阈值val的所有值

这会查找大于/等于0.004的所有值,但考虑到我的数据大小,这需要一些时间。

我想减少时间并且考虑使用bin文件(显然它们在不丢失精度方面比txt文件更好?)等,但是我不能用语法/方法知道

我已设法将数据保存到bin文件中,但是搜索这个大文件的最快方式是什么? 我想要的唯一输出数据是实际值大于我指定的值。

最好使用bin文件吗?还是一个matfile?等

我不想将整个文件加载到matlab中。我想节省matlab内存,因为其他程序可能需要空间而我不想再次出现内存错误

1 个答案:

答案 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中可能非常快。