在另一个文件中的相应值的文件中替换键的副本

时间:2016-09-22 16:15:21

标签: text replace data-manipulation file-manipulation bigdata

我有两个大文件:第一个(10GB)包含具有特定格式{keyX}的密钥副本的文本,第二个(3GB)包含密钥与其值(45个百万条目)之间的映射

文件1:

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

file2的:

{key1} dolor
...
{key41736928} adipiscing
...

考虑到第二个文件的维度,我无法在内存中加载所有键值对,但是我无法在每个键的出现位置搜索整个第二个文件。

如何在相当长的时间内用第二个文件中的相对值替换第一个文件中的所有键?

2 个答案:

答案 0 :(得分:0)

您可以将第二个文件拆分为多个词典,并针对每个词典处理第一个文件。但是有多少字典?我会说,进行一个实验,你从第一个文件中处理(说)1Mb数据,而不是从第二个(例如)10Mb,100Mb,200Mb,500Mb处理不同数量的数据,以确定(a)是否存在你的水平可用资源无法应对,以及(b)这对文件的时间随字典大小的变化而变化。然后判断这是一种可行的方法,如果是,则使用什么大小的分配。

答案 1 :(得分:0)

在第二个文件中使用二进制搜索。它按键排序,因此您可以做的最好的是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