python mmap正则表达式搜索两个文件中的常见条目

时间:2013-05-13 16:19:03

标签: python algorithm mmap

我有2个巨大的xml文件。一个是大约40GB,另一个大约是2GB。假设xml格式是 像这样的东西

< xml >
    ...
    < page >
        < id > 123 < /id >
        < title > ABC < /title >
        < text > .....
            .....
            .....
        < /text >
    < /page >
    ...
< /xml >

我使用mmap为文件1和文件2创建了一个索引文件 每个索引文件都符合以下格式:

Id  <page>_byte_position    </page>_byte_position   

所以,基本上给了一个Id,从索引文件中,我知道标签在哪里开始该ID以及它在哪里结束,即标记字节位置。

现在,我需要做的是: - 我需要能够找出较小索引文件中的每个id(2GB),   如果id存在于较大的索引文件中 - 如果id存在,我需要能够获得_byte_pos和_byte_pos   来自较大索引文件的id(对于40GB文件)

我目前的代码非常慢。我想我正在做一个O(m * n)算法,假设m的大小为 较大的文件和较小的文件的n。

with open(smaller_idx_file, "r+b") as f_small_idx:
    for line in f_small_idx.readlines():
        split = line.split(" ")
        with open(larger_idx_file, "r+b") as f_large_idx:
            for line2 in f_large_idx.readlines():
                split2 = line2.split(" ")
                if split[0] in split2:
                    print split[0] 
                    print split2[1] + "  " + split2[2]

这非常慢!!!!
有什么更好的建议??

基本上,给定2个大文件,如何搜索较小文件中特定列中的每个单词是否存在于大文件中,如果存在,则还需要提取其他相关字段。

任何建议都将不胜感激!! :)

1 个答案:

答案 0 :(得分:2)

现在没有时间进行详细的回答,但这应该有效(假设临时字典适合记忆):

  1. 迭代较小的文件并将相关列的所有单词放在dict中(在dict中查找的平均大小写表现为O(1))
  2. 迭代更大的文件并查找dict中的每个单词,直接用dict条目或其他地方存储相关信息。
  3. 如果这不起作用,我会建议先对文件进行排序(或过滤),以便可以独立处理块(即只比较以A开头的所有内容然后B ...)