我正在创建一个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,然后根据键和值比较结果。它也有一个规定,我们可以明确定义为与文件2列相匹配的列File1和也忽略所有不需要的。在系统中运行这个和比较有大约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中的行号为Key和Header4值作为
{'Value16':1,'Value8':2,'Value4':3,'Value12':4}
因此,在下一步中,我将遍历文件1中的行,为每一行选择主键值,在字典中进行查找以从字典中获取相应的行号。 现在遍历File2到特定的行,为File1和File2中的两行创建一个有序的Dic,比较它们并写入结果。整个过程按预期进行,并给出适当的比较结果。 但是,当我尝试比较具有约10,00,000行和60列的文件时,要花24个多小时才能完成。为了使这一过程有点快,我试图加载在内存中的文件2,然后进行比较,但仍是走了20多个小时才能完成。 任何人都可以通过一种更有效的算法来帮助我或向我提出建议,该算法可以使整个过程大大加快。
PS:-我正在测试的系统是具有8GB RAM和Windows 10操作系统的i5 8thGen。完整的开发是在Python3.7中完成的
答案 0 :(得分:0)
现在遍历File2到特定行,为File1和File2中的两行创建一个有序的Dic,比较它们并写入结果。
这就是在吃时间。我认为这使您的解决方案花费了二次时间。
您可以做的是从每个文件创建两个字典。
Header1,Header2,Header3,Header4
Value1,Value2,Value3,Value4
Value5,Value6,Value7,Value8
Value9,Value10,Value11,Value12
Value13,Value14,Value15,Value16
所以^变成
{
Value4 : (1, Value1,Value2,Value3,Value4),
Value8: (2, Value5,Value6,Value7,Value8), ...
}
对第二个文件也执行相同的操作。
现在,您可以遍历一个字典,并在另一个字典中查找行内容的值。行内容在字典中,因此您不必爬到文件中的行。由于文件大小约为300MB,因此整个文件应该可以容纳8GB的内存。
希望这会有所帮助。
答案 1 :(得分:0)
如果您担心较大的文件会占用过多的内存空间,则可以分两步解决问题,首先准备一个临时文件,该文件的所有记录都位于具有相同主键的相同位置,然后只需比较一下file1临时文件而不是文件2
执行以下操作- 1.确保使用主键对两个文件进行排序。 2.从文件1开始并检查第一个记录的主键,保持迭代第二个文件,直到在第二个文件中找到匹配的主键或第二个文件的主键为>第一个文件的主键。 如果主键匹配,则将第二个文件的记录写入临时文件。 如果找不到匹配项,并且第一个文件的主键<第二个文件的主键-在临时文件中写空行,则转到第一个文件的下一个记录。
执行步骤3,直到第一个文件用尽。这样,您将获得具有相同主键的相同行或空白行的第一个文件和临时文件。
只需比较File1和Temp文件一次读取一条记录。