删除非常大的数据集上的重复项

时间:2018-09-19 13:49:12

标签: python duplicates large-data

我正在处理一个13.9 GB的csv文件,该文件包含大约1600万行和85列。我知道可能有几十万行重复。我运行这段代码将其删除

import pandas

concatDf=pandas.read_csv("C:\\OUT\\Concat EPC3.csv")
nodupl=concatDf.drop_duplicates()
nodupl.to_csv("C:\\OUT\\Concat EPC3- NoDupl.csv",index=0)
low_memory=False  

但是,这使我遇到了MemoryError。我的内存是16GB,不能再高了。是否有一种更有效的删除重复项的方法,它可能会将它切成块,而无需我将csv文件分解成更小的文件?

3 个答案:

答案 0 :(得分:5)

最简单的解决方案是为文件中的每一行创建一个哈希表-在工作内存中存储16M哈希应该不是问题(取决于哈希大小),然后您可以再次遍历文件并确保您仅记下每个哈希的一次出现。您甚至都不需要解析CSV,也不需要熊猫。

import hashlib

with open("input.csv", "r") as f_in, \
        open("output.csv", "w") as f_out:
    seen = set()  # a set to hold our 'visited' lines
    for line in f_in:  # iterate over the input file line by line
        line_hash = hashlib.md5(line.encode()).digest()  # hash the value
        if line_hash not in seen:  # we're seeing this line for the first time
            seen.add(line_hash)  # add it to the hash table
            f_out.write(line)  # write the line to the output

这使用MD5作为哈希值,因此每行大约需要16B +设置的开销,但这仍然远远少于将所有内容存储在内存中-您可以预期1600万行CSV文件的内存使用量为500MB。

答案 1 :(得分:1)

zwer基本相同,但是检查具有相同散列的行是否相等(而不是自动丢弃重复的散列)。

file_in = "C:\\OUT\\Concat EPC3.csv"
file_out = "C:\\OUT\\Concat EPC3- NoDupl.csv"

with open(file_in, 'r') as f_in, open(file_out, 'w') as f_out:
    # Skip header
    next(f_in)
    # Find duplicated hashes
    hashes = set()
    hashes_dup = {}
    for row in f_in:
        h = hash(row)
        if h in hashes:
            hashes_dup[h] = set()
        else:
            hashes.add(h)
    del hashes
    # Rewind file
    f_in.seek(0)
    # Copy header
    f_out.write(next(f_in))
    # Copy non repeated lines
    for row in f_in:
        h = hash(row)
        if h in hashes_dup:
            dups = hashes_dup[h]
            if row in dups:
                continue
            dups.add(row)
        f_out.write(next(f_in))

答案 2 :(得分:0)

UNIX模拟器呢?

uniq <filename> >outputfile.txt

(类似的东西)