繁体   English   中英

比较两个没有共同行的大文件

[英]Compare two large files not having a single line in common

我有两个大(10M 行)文件,都是数据文件。 每行包含多个字段,最后 3 个字段分别给出 x、y、z第二个文件。 我唯一想到的是

loop over file1
   read file1: eventnr1 energy1 posX1 posY1 posZ1
   loop over file2
      read file2: eventnr2 energy2 posX2 posY2 posZ2
      if ( fabs(posX1 - posX2) < 0.00001 && fabs(posY1 - posY2) < 0.00001 etc...)

当然,这非常耗时(我尝试了 bash 脚本和 C++ 程序,我不确定哪个会更快)。 有谁知道更聪明(更快)的方式?

需要明确的是,除了一两行之外,这些文件可能完全不同。 使用 UNIX “差异”将不起作用(文件太大)。

此致,

马希尔

  • 读取两个文件的所有内容
  • 对它们进行排序
  • 从指向两个条目列表的第一个条目的指针开始,并增加指向较小条目的指针,直到到达末尾

这是O(N*logN) (对于排序,rest 是线性的),与使用蛮力方法的O(N*N)相比。

0) 如果您有足够的 RAM 将较小文件的字段保存在 RAM 中,您可以这样做。
0 a) 将它存储在 HashMap 中(如果你能负担得起它的开销并且可以使用散列函数来散列与你假设它们相同到相同值的数字相似的数字)-> 检查成本O( 1)
0 b) 对 RAM 中的文件进行排序(成本O(n * log n)并稍后检查成本O(log n)

遍历不在 ram 中的文件并检查每个值是否已经在 RAM 中。

这样,您只需读取两个文件一次,成本为 a) O(n) ,b) O(n log n)


1)如果无法将较小的文件加载到RAM中:对较小文件的每个数据块执行与0)相同的操作。 这意味着您需要从一个文件中读取块(k 块),并为每个文件遍历另一个文件。

这样,您读取较小的文件一次,然后再读取 k 次。 成本是 a) O(k n) , b) O(k n/k log n/k + n k*log n/k )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM