在一个大的二进制文件中搜索,在缓冲区中加载块
search in a big binary file loading blocks in buffer
我想知道在大文件中按块搜索,加载到内存缓冲区的算法。
所以我有一个很大的文件,将把它读取到小缓冲区并扫描它以查找 "needle" 个单词:
while ( read = fread(buff, buff_size, 1, file) )
if strstr(buff, needle) print "found!";
但是如果"hay"中的"needle"会被块边框截断呢?将无法找到。
我看到的一个解决方案是每次都读取下一个块 fseek'ing(减少 "needle" 字符串长度的偏移量)
offset += read - strlen(needle);
if (offset > 0) fseek(file, offset ,SEEK_SET);
我说得对吗?
您说得对,您需要处理搜索模式跨越两个块的情况。
你说的也对,寻求也是一种解决方法。
但是还有其他不使用搜索的解决方案。
解决方案 1
一个解决方案可能是复制缓冲区的最后一部分,即 strlen(needle)
到一个能够容纳 2 次 strlen(needle)
的小缓冲区。
然后在读取下一个块时,将新缓冲区的第一部分(再次strlen(needle)
)复制到小缓冲区,以便它与前一个缓冲区末尾的部分相连接。
终于可以在小缓冲区中搜索 niddle 了。
解决方案 2
一个解决方案可能是从文件读入 buffer + strlen(needle)
,即避免覆盖缓冲区的前 strlen(needle)
个字符。从文件中读取的字符数必须相应减少(即 buff_size - strlen(needle)
)
完成缓冲区后,将最后 strlen(needle)
个字符复制到缓冲区的开头,然后从文件中读取更多数据到 buffer + strlen(needle)
对于缓冲区中的第一次搜索,您必须跳过前 strlen(needle)
个字符(或确保它们不匹配您的模式,例如通过初始化)。后续搜索应搜索整个缓冲区。
我想知道在大文件中按块搜索,加载到内存缓冲区的算法。
所以我有一个很大的文件,将把它读取到小缓冲区并扫描它以查找 "needle" 个单词:
while ( read = fread(buff, buff_size, 1, file) )
if strstr(buff, needle) print "found!";
但是如果"hay"中的"needle"会被块边框截断呢?将无法找到。
我看到的一个解决方案是每次都读取下一个块 fseek'ing(减少 "needle" 字符串长度的偏移量)
offset += read - strlen(needle);
if (offset > 0) fseek(file, offset ,SEEK_SET);
我说得对吗?
您说得对,您需要处理搜索模式跨越两个块的情况。
你说的也对,寻求也是一种解决方法。
但是还有其他不使用搜索的解决方案。
解决方案 1
一个解决方案可能是复制缓冲区的最后一部分,即 strlen(needle)
到一个能够容纳 2 次 strlen(needle)
的小缓冲区。
然后在读取下一个块时,将新缓冲区的第一部分(再次strlen(needle)
)复制到小缓冲区,以便它与前一个缓冲区末尾的部分相连接。
终于可以在小缓冲区中搜索 niddle 了。
解决方案 2
一个解决方案可能是从文件读入 buffer + strlen(needle)
,即避免覆盖缓冲区的前 strlen(needle)
个字符。从文件中读取的字符数必须相应减少(即 buff_size - strlen(needle)
)
完成缓冲区后,将最后 strlen(needle)
个字符复制到缓冲区的开头,然后从文件中读取更多数据到 buffer + strlen(needle)
对于缓冲区中的第一次搜索,您必须跳过前 strlen(needle)
个字符(或确保它们不匹配您的模式,例如通过初始化)。后续搜索应搜索整个缓冲区。