【发布时间】:2019-01-31 19:36:44
【问题描述】:
我正在创建一个 CSV 文件比较器,它可以比较超过 300 MB 的文件。 我创建了第一个版本,它可以比较 2 个大型 CSV 文件,其中列可以按任何顺序排列,但行需要按完全相同的顺序排列 像 文件1:-
Header1,Header2,Header3,Header4
Value1,Value2,Value3,Value4
Value5,Value6,Value7,Value8
Value9,Value10,Value11,Value12
Value13,Value14,Value15,Value16
文件2:-
Header1,Header3,Header2,Header4
Value1,Value3,Value2,Value4
Value5,Value7,Value3,Value8
Value9,Value11,Value10,Value12
Value13,Value15,Value14,Value16
所以我在这里所做的是我正在一起读取文件并逐个迭代行,将其转换为有序 Dic 并根据键和值比较结果。它还有一项规定,我们可以明确定义哪些列将 File1 与 File2 中的列匹配,并且还可以忽略哪些不需要。在系统中运行它并比较大约 10,00,000 行和 60 列的文件需要 30 分钟。 我现在已经开始研究该工具的下一个版本,但问题出在这种情况下,行和列将完全无序,例如 文件1:-
Header1,Header2,Header3,Header4
Value1,Value2,Value3,Value4
Value5,Value6,Value7,Value8
Value9,Value10,Value11,Value12
Value13,Value14,Value15,Value16
文件2:-
Header1,Header3,Header2,Header4
Value13,Value15,Value14,Value16
Value5,Value7,Value3,Value8
Value1,Value3,Value2,Value4
Value9,Value11,Value10,Value12
考虑到会有一个主键,假设在上述情况下让Header4 成为两个文件的主键,我正在做的是创建字典,它将 File2 中的行号作为键并将 Header4 值作为
{'Value16':1,'Value8':2,'Value4':3,'Value12':4}
因此,在下一步中,我将遍历文件 1 中的行,获取每一行的主键值,在字典中进行查找,从字典中获取相应的行号。 现在遍历 File2 到特定行,为 File1 和 File2 中的行创建一个有序 Dic 比较它们并写入结果。整个过程按预期工作,并且还给出了适当的比较结果。 但是,当我尝试比较具有大约 10,00,000 行和 60 列的文件时,它需要超过 24 小时才能完成。为了让这个过程更快一点,我尝试将 File2 加载到内存中,然后进行比较,但仍然需要 20 多个小时才能完成。 任何人都可以帮助我或向我推荐一种更有效的算法,可以使整个过程大大加快。
PS:- 我用于测试的系统是 i5 8th Gen,具有 8GB RAM 和 Windows 10 操作系统。完整的开发在 Python3.7 中完成
【问题讨论】:
-
我认为一个选项是 sql express server,您可以将所有 csv 导入它,然后创建连接以比较数据。
-
@davedwards 问题陈述完全不同,文件在行和列方面高度排序,但这里完全不同
标签: python-3.x algorithm csv file-comparison