繁体   English   中英

在 Python 中从非常大的文本文件中删除重复项的更快方法?

[英]Faster way to remove duplicates from a very large text file in Python?

我有一个非常大的文本文件,其中包含要消除的重复条目。 我不关心条目的顺序,因为文件稍后会被排序。

这是我到目前为止所拥有的:

unique_lines = set()
outfile = open("UniqueMasterList.txt", "w", encoding = "latin-1")

with open("MasterList.txt", "r", encoding = "latin-1") as infile:
    for line in infile:
        if line not in unique_lines:
            outfile.write(line)
            unique_lines.add(line)

outfile.close()

它已经运行了30分钟,还没有完成。 我需要它更快。 Python 中更快的方法什么?

查找相应的系统命令。 Linux / UNIX中 ,您将使用

uniq MasterList.txt > UniqueMasterList.txt

操作系统通常知道执行这些操作的最佳方法。


评论后

@Mark Ransom提醒我,uniq取决于文件中连续的匹配行。 实现此目的的最简单方法是对文件进行排序:

sort MasterList.txt | uniq > UniqueMasterList.txt

要在Python中使用与uniq相同的技术,请执行以下操作:

import itertools
with open("MasterList.txt", "r", encoding = "latin-1") as infile:
    sorted_file = sorted(infile.readlines())
for line, _ in itertools.groupby(sorted_file):
    outfile.write(line)

假定整个文件将两次装入内存。 或者该文件已经排序,您可以跳过该步骤。

我建议的简单方法是使用哈希表和哈希表。您可以使用高效的哈希函数对每一行进行哈希处理,然后将其插入哈希表中,并输出count为1的内容。类似于使用来解决单词/字母计数问题哈希表。查找仅花费o(1),并且可以将内存使用量限制为恒定量,具体取决于所使用的哈希表的大小。

SPLIT_COUNT = 30


def write_data(t_file, value):
    t_file.write(value)


def calculate_hash(filename, handle_file):

    with open(filename, 'r') as f:

        for line in f:

            write_data(handle_file[hash(line)%SPLIT_COUNT], line)


def generate_file(dir):

    handle_file, files = [], []

    for i in range(SPLIT_COUNT):

        path = dir+"split_"+str(i)

        files.append(path)

        f = open(path, 'w')

        handle_file.append(f)

    return files, handle_file


def close_file(handle_file):

    for i in range(len(handle_file)):

        handle_file[i].close()


def data_uniq(files, new_file):

    dataset = dict()

    n_file = open(new_file, 'w')

    for filename in files:

        f = open(filename, 'r')

        for line in f:

            dataset[line] = 1

        f.close()

        for key in dataset.keys():

            n_file.write(key)

        dataset = {}

    n_file.close()


if __name__ == "__main__":
    filename = './clean.txt'
    generate_dir = './tmp/'
    new_file = './out.txt'
    files, handle_file = generate_file(generate_dir)
    calculate_hash(filename, handle_file)
    close_file(handle_file)
    data_uniq(files, new_file)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM