我的代码读取CSV文件并计算其中的行数,以及每列中非空值和唯一值的数量。它可以很好地处理小文件,大小为几千兆字节。大于20 GB的文件会出现这个问题--接下来的每一百万行的处理速度越来越慢,然后就会出现内存不足的情况。
问题是代码处理内存中的唯一值,而内存不可能是无限的。文件的重量不仅可以达到20千兆字节,也可以达到200千兆字节。如何解决这一问题?
def read_csv(file_path, delimiter, encoding):
with open(file_path, encoding=encoding) as f:
reader = csv.reader(f, delimiter=delimiter)
header = next(reader)
columns = {col_name: {'total': 0, 'not_null': 0, 'unique': 0, 'first_five': set()} for col_name in header}
column_data = defaultdict(lambda: defaultdict(int))
print('!')
num = 0
for row in reader:
if num % 1000000 == 0:
print(num / 1000000, 'M rows')
num+=1
try:
for col_index, col_value in enumerate(row):
column_name = header[col_index]
columns[column_name]['total'] += 1
if col_value:
columns[column_name]['not_null'] += 1
column_data[column_name][col_value] += 1
if column_data[column_name][col_value] == 1:
columns[column_name]['unique'] += 1
if len(columns[column_name]['first_five']) < 5:
columns[column_name]['first_five'].add(col_value)
except:
print(row)
1条答案
按热度按时间bkkx9g8r1#
因为你是在计算唯一值,所以在将它们添加到字典/集合之前,你可能有更多的回旋余地来散列值。也许是这样的:
如果你担心sha 256冲突,我认为hashlib也会支持sha 512。