我想使用正则表达式来提高我在大型二进制图像中搜索特定记录的速度。似乎正则表达式搜索总是胜过我自己的搜索方法,所以这就是为什么我正在研究这个问题。我已经实现了以下功能,但效果不是很快。
我的二进制图像作为单词加载到Numpy memmap中。
update semester_workload tA
set tA.account = (SELECT DISTINCT (t2.WORKING - t2.WORKLOAD) FROM SEMESTER_WORKLOAD t1
join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW);
where exists (SELECT 1 FROM SEMESTER_WORKLOAD t1
join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW);
现在这是我的搜索循环的开始(有效):
I_FILE = np.memmap(opts.image_file, dtype='uint32', mode='r')
这是寻找19字节长的记录,以0到59之间的十进制序列号开头。它在当前搜索位置之前或之后的记录中查找递增序列以验证记录。
我已经看到一些例子,人们使用re.escape将变量制作成字符串(如下所示:How to use a variable inside a regular expression?)但我似乎无法弄清楚如何搜索不断变化的值序列。
答案 0 :(得分:0)
我设法让它与正则表达式一起工作,但它比我预期的要复杂一点。正则表达式表示0到59之间的两个值,它们由72个字节(18个字)分隔。我使用了两次正则表达式搜索,以确保在序列结束时我不会错过记录:
# First search uses the lookahead assertion to not consume large amounts of data.
SearchPattern1 = re.compile(b'[\0-\x3B]\0\0\0(?=.{72}[\1-\x3B]\0\0\0)', re.DOTALL)
# Again using the positive lookbehind assertion (?<= ... ) to grab the ending entries.
SearchPattern2 = re.compile(b'(?<=[\0-\x3B]\0\0\0.{72})[\1-\x3B]\0\0\0', re.DOTALL)
接下来,执行两次搜索并合并结果。
HitList1 = [m.start(0) for m in SearchPattern1.finditer(I_FILE)]
HitList2 = [m.start(0) for m in SearchPattern2.finditer(I_FILE)]
AllHitList = list(set(HitList1 + HitList2))
SortedHitList = sorted(AllHitList)
现在我运行的搜索条件与原始解决方案的条件相同,但它运行的数据量要小得多!
for i in range(0, len(SortedHitList)):
TestLoc = SortedHitList[i]
if (I_FILE[TestLoc] + 1 == I_FILE[TestLoc + 19]) or (I_FILE[TestLoc - 19] + 1 == I_FILE[TestLoc]):
... do stuff ...
结果非常成功!原始解决方案在300 MB二进制文件上运行需要58秒,而新的正则表达式解决方案只用了2秒!!