我正在处理一个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文件分解成更小的文件?
答案 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
(类似的东西)