我有两个大文件:第一个(10GB)包含以特定格式{keyX}
出现的键的文本,第二个(3GB)包含键和它们的值之间的映射(4500万个条目)。
file1:
Lorem ipsum {key1} sit amet, consectetur {key41736928} elit, ...
file2:
{key1} dolor
...
{key41736928} adipiscing
...
考虑到第二个文件的维度,我不能在内存中加载所有的键值对,但我不能在整个第二个文件中搜索每个键的出现。
如何在适当的时间内将第一个文件中的所有键替换为第二个文件中的相对值?
可以将第二个文件拆分为多个字典,并根据每个字典处理第一个文件。但是有多少字典呢?我想说的是,进行一个实验,处理(比如)来自第一个文件的1Mb数据和来自第二个文件(比如)10Mb、100Mb、200Mb、500Mb的不同数量的数据,以确定(a)是否存在可用资源无法处理的级别,以及(b)这对文件的字典大小如何随时间变化。然后判断什么时候这是一个可行的方法,如果是,使用什么大小的分配。
在第二个文件中使用二进制搜索。它是按键排序的,所以你能做的最好的搜索是log(n)。
def get_row_by_id(searched_row_id):
step = os.path.getsize(mid_name_file) / 2.
step_dimension = step
last_row_id = ""
with open(mid_name_file, 'r') as f:
while True:
f.seek(int(step), 0) # absolute position
seek_to(f, 'n')
row = parse_row(f.readline())
row_id = row[0]
if row_id == last_row_id:
raise ValueError(searched_row_id)
else:
last_row_id = row_id
if row_id == searched_row_id:
return row[1]
elif searched_row_id < row_id:
step_dimension /= 2.
step = step - step_dimension
else:
step_dimension /= 2.
step = step + step_dimension
def seek_to(f, c):
while f.read(1) != c:
f.seek(-2, 1)
def parse_row(row):
return row.split('t')[0], row