我有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个大文件,如何搜索较小文件中特定列中的每个单词是否存在于大文件中,如果存在,则还需要提取其他相关字段。
任何建议都将不胜感激!! :)
答案 0 :(得分:2)
现在没有时间进行详细的回答,但这应该有效(假设临时字典适合记忆):
如果这不起作用,我会建议先对文件进行排序(或过滤),以便可以独立处理块(即只比较以A开头的所有内容然后B ...)