在另一个文件中用一个文件替换密钥的发行号
问题描述:
我有两个大文件:第一个(10GB)包含文本,密钥的发行版以特定格式{keyX}
,第二个(3GB)包含密钥之间的映射和他们的价值(四千五百万条目)。在另一个文件中用一个文件替换密钥的发行号
文件1:
Lorem ipsum {key1} sit amet, consectetur {key41736928} elit, ...
文件2:
{key1} dolor
...
{key41736928} adipiscing
...
考虑到我无法加载所有内存中的键值对,但我不能在整个第二搜索第二个文件的尺寸文件为每个键的发生。
如何将第一个文件中的所有键与第二个文件中的相对值用相当长的时间替换?
答
在第二个文件中使用二进制搜索。它是按键排序的,所以你可以做的最好的是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
答
您可以将第二个文件拆分为多个字典并根据这些字典处理第一个文件。但有多少个字典?我会说,进行一个实验,从第一个文件中处理(比如说)1Mb的数据与第二个(比如说)10Mb,100Mb,200Mb,500Mb中的不同数量进行处理,以确定(a)是否存在一个级别,可用资源无法应付,以及(b)这对文件的时间与字典大小之间的差异。然后对这是一种可行的方法做出判断,如果是的话,则对这种分配的大小进行判断。