我正在寻找在Python 2.x中编写一个脚本,该脚本将扫描物理驱动器(物理的和非逻辑的)以查找大小不等的特定文本字符串(聊天工件)。我有我的页眉和页脚的字符串,所以我只是想知道如何最好扫描驱动器?我担心的是,如果我把它拆分成250MB的块,并在解析它的页眉和页脚之前将这些数据读入RAM,那么它可能是标题,但是页脚在250MB的下一个块中。
所以从本质上讲,我想扫描PhysicalDevice0以查找以“ABC”开头并以“XYZ”结尾的字符串,并从内部复制所有内容。我不确定是否也将数据扫描为ascii或Hex。
随着驱动器变大,我希望以最快的方式做到这一点。
有什么建议吗?
答案 0 :(得分:1)
您的问题可以表述为“如何在没有行结构的非常长的文件中进行搜索”。如果你一次一行地读取面向行的文本,这与你所做的没什么不同:想象一下你是在逐块读取一个文本文件,但是有一个面向行的正则表达式来搜索;你要搜索你读过的块中的最后一个完整行,然后保持最后一条不完整的行并读取另一个块来扩展它。因此,您不会重新开始每个新的块读取。把它想象成一个滑动窗口;你只需将它推进就可以丢弃你能够完全搜索的部分。
在此处执行相同的操作:编写代码,以便匹配的字符串永远不会到达缓冲区的边缘。例如,如果您要搜索的标题长度为100个字节:读取一个文本块;检查块中是否出现完整模式;在当前块结束之前将读取窗口提前100个字节,并在其后添加新块的文本值。现在您可以搜索标题而不会有丢失它的风险。一旦找到它,就会提取文本,直到看到停止模式(页脚)。如果它在同一个块或五个块之后无关紧要:您的代码应该知道它处于提取模式,直到看到停止模式。