gpt4 book ai didi

matlab - Matlab 内存映射中的高效字节模式搜索

转载 作者:行者123 更新时间:2023-12-02 02:27:29 25 4
gpt4 key购买 nike

我有大型二进制文件 (2+ GB),这些文件采用同步模式 (0xDEADBEEF) 排列,后跟固定大小的数据 block 。示例:

0xDE AD BE EF ... 96 bytes of data
0xDE AD BE EF ... 96 bytes of data
... repeat ...

我需要找到每个数据包开头的偏移量。理想情况下,这只是 [1:packetSize:fileSize] 但是,还有其他可以散布的数据、 header 等,因此我需要在文件中搜索同步模式。

我正在使用以下基于 Loren from Mathworks findPattern2 的代码但稍微修改一下以使用内存映射。

function pattLoc = findPattern(fileName, bytePattern)
%Mem Map file
m = memmapfile(fileName);
% Find candidate locations match the first element in the pattern.
pattLoc = find(m.data==bytePattern(1));
%Remove start values that are too close to the end to possibly match
len = numel(bytePattern);
endVals = pattLoc+len-1;
pattLoc(endVals>length(m.data)) = [];
% loop over elements of Sync Pattern to check possible location validity.
for pattval = 2:len
% check viable locations in array
locs = bytePattern(pattval) == m.data(pattLoc+pattval-1);
pattLoc(~locs) = []; % delete false ones from indices
end

这个效果非常好。不过,我认为可能还有改进的空间。首先,我知道我的模式不能比 packetSize (本例中为 100)更近,但可能会更远。看来我应该能够以某种方式使用这些信息来加快搜索速度。其次,第 5 行的初始搜索使用 find 进行数字索引而不是逻辑索引。这条线花费的时间几乎是逻辑线的两倍。然而,我尝试仅使用逻辑索引来重写此函数,但惨败。问题出现在循环内部,并使用逻辑跟踪嵌套索引,而不使用更多查找...或检查超出需要的数据。

因此,任何有助于加快速度的帮助将不胜感激。下面是一些代码,将创建一个简单的示例二进制文件,以便在必要时使用。

function genSampleFile(numPackets)
pattern = hex2dec({'DE','AD','BE','EF'});
fileName = 'testFile.bin';
fid = fopen(fileName,'w+');
for f = 1:numPackets
fwrite(fid,[pattern; uint8(rand(96,1)*255)],'uint8');
end
fclose(fid);

搜索包含 10000000 个数据包的文件需要执行以下操作:

>> genSampleFile(10000000); %Warning Makes 950+MB file
>> tic;pattLoc = findPattern(fileName, pattern);toc
Elapsed time is 4.608321 seconds.

最佳答案

您可以使用 findstr 立即获得提升,或者更好 strfind 而不是 find :

pattLoc = strfind(m.data, bytePattern)

这消除了任何进一步循环的需要。您只需要清理返回的索引数组中的一些内容即可。

您想要删除距离末尾不超过 100 个字节的内容,而不是距离末尾不超过 4 个字节的内容,因此设置 len = 100 ,而不是 len = length(bytePattern) .

要过滤掉彼此距离小于 100 字节的元素,请使用 diff 在索引列表中:

pattLoc[diff(pattLoc) < 100] = []

这应该通过更多地依赖内置函数来加速您的代码,这通常比循环更有效。

关于matlab - Matlab 内存映射中的高效字节模式搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36698094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com