用另一个文件中的相应值替换文件中出现的键

Substitute key's occurrencies in a file with corresponding value in another file

我有 2 个大文件:第一个 (10GB) 包含带有特定格式键出现的文本 {keyX} 第二个 (3GB) 包含键与其值之间的映射(4500 万条目)。

文件 1:

Lorem ipsum {key1} sit amet, consectetur {key41736928} elit, ...

文件 2:

{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