【问题标题】:CSV File Comparison Algorithm in Python3Python3中的CSV文件比较算法
【发布时间】: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


【解决方案1】:

现在遍历 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), ... 
} 

对第二个文件也这样做。

现在您可以遍历一个字典并在另一个字典中查找行内容的值。行内容在 dict 中,因此您不必爬到文件中的行。由于文件约为 300MB,因此整个文件应该适合您拥有的 8GB 内存。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您担心较大的文件会占用过多的内存空间,您可以分两步解决您的问题,首先准备一个临时文件,该文件将所有记录与匹配的主键放在相同的位置,然后简单地比较 file1使用临时文件而不是 file2,

    执行以下操作 - 1. 确保使用主键对两个文件进行排序。 2. 从文件 1 开始并检查第一个记录主键,继续迭代第二个文件,直到在第二个文件或第二个文件中达到匹配的主键主键是>第一个文件主键。 如果主键匹配,则将第二个文件的记录写入临时文件。 如果未找到匹配且第一个文件的主键

    1. 执行第 3 步,直到第一个文件用完。这样,您将获得第一个文件和临时文件,它们在同一行或空行具有相同的主键。

    2. 只需比较 File1 和 Temp 文件一次读取一条记录。

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2021-02-16
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多