【问题标题】:Comparing Huge Files using C++使用 C++ 比较大文件
【发布时间】:2012-08-06 17:14:26
【问题描述】:

我有两个大文本文件,每个文件都有超过 1000 万行。如何使用 C++ 比较文件并获取文件中的不同行。

我尝试将一个文件加载到内存中并对内存进行排序并使用二叉​​树逻辑来比较文件。它比较并在 20 秒内给了我结果。但它会消耗更多的内存。 (文本文件大约 500 MB)。

我想比较两个文件而不消耗更多内存、良好的性能并且对硬盘的影响最小。

【问题讨论】:

  • 第一步是选择一种语言。 C 和 C++ 的解决方案会有所不同。
  • 差异工具不能满足您的要求吗?比重新发明轮子更容易。
  • 这让我想起了“质量、预算、时间 - 选择两个”
  • 你的意思是像一个差异?一次只读取每个文件的一行。否则这个问题太模糊和模棱两可了。文件是否只是几组行,这意味着它们的顺序并不重要?目前尚不清楚“不同的线条”究竟是什么意思。
  • 您想知道这两个文件的不同之处(基本上是diff),或者哪些行在一个文件中而不在另一个文件中?

标签: c++ file diff


【解决方案1】:

您可以使用两遍方法。

第一遍,您读取文件但只存储哈希值和行的行首位置,然后您可以根据哈希值比较文件,您只有在第二遍中再次读取行进行完整比较时两行具有相同的哈希价值。这将节省内存消耗和 cpu 时间,但读取某些行两次会有点损失。

【讨论】:

  • 我的建议相同,但后来我认为当哈希 equal(几乎永远)时,可能需要获取文本以确保比较。因此,这种幼稚的策略可能不是很有效。 OTH diff 应该使用类似的东西。
  • 如果您不在乎在宇宙结束前是否犯了一次或两次错误,只需在源代码行上使用 128 位哈希码即可。对 1000 万行进行错误比较的概率是 (1-2^(-128))*10^7 ~~ 1-2^(-103)。似乎足够安全。
  • @IraBaxter 好吧,其实我很在意 ;) 我想很多人也很在意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2017-06-23
  • 2011-12-02
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多