c# - 查找 2 个巨大区域(文本)文件之间的变化

标签 c# .net text large-files

我可以访问 .com 区域文件。区域文件是一个包含域名及其名称服务器列表的文本文件。它遵循如下格式:

mydomain NS ns.mynameserver.com.
mydomain NS ns2.mynameserver.com.
anotherdomain NS nameservers.com.
notinalphadomain NS ns.example.com.
notinalphadomain NS ns1.example.com.
notinalphadomain NS ns2.example.com.

如您所见,每个域可以有多行(当有多个名称服务器时),并且该文件不是按字母顺序。 这些文件的大小约为 7GB

我正在尝试获取以前的文件和新文件,并比较它们以找到:

  1. 添加了哪些域名
  2. 删除了哪些域
  3. 哪些域的域名服务器发生了变化

由于 7GB 太多无法将整个文件加载到内存中,显然我需要在流中读取。我目前认为最好的方法是对两个文件进行多次传递。对字母表中的每个字母进行一次传递,例如在第一次传递中加载以“a”开头的所有域。 从旧文件和新文件中获取所有“a”域后,我可以在内存中进行非常简单的比较以找出更改。

问题是,即使逐个字符读取并尽可能多地进行优化,每次遍历文件都需要大约 200-300 秒,收集当前通行证的所有域名。因此,我认为在其当前状态下,我正在寻找大约一个小时来处理文件,甚至没有将更改存储在数据库中(这将需要更多时间)。这是在双四核 xeon 服务器上,因此对我来说,投入更多的马力并不是一个好的选择。 这个时机可能不会破坏交易,但我希望有人对如何加快速度有一些好主意……诚然,我还没有尝试过异步 IO,这是我的下一步。

提前感谢您的任何想法!

最佳答案

准备数据可能会有所帮助,无论是在最好的代码类型(未编写的类型)还是在执行速度方面。

cat yesterday-com-zone | tr A-Z a-z | sort > prepared-yesterday
cat today-com-zone | tr A-Z a-z | sort > prepared-today

现在,您的程序执行一个非常简单的差异算法,您甚至可以使用 diff:

diff prepared-today prepared-yesterday

编辑:

还有一个替代解决方案,它以 diff 执行时间为代价,删除了一些额外的处理。这也假定使用 GnuWin32 CoreUtils:

sort -f <today-com-zone >prepared-today
sort -f <yesterday-com-zone >prepared-yesterday
diff -i prepared-today prepared-yesterday

输出将是添加、删除和更改的列表。每个区域不一定有 1 个更改记录(考虑按字母顺序删除两个域时会发生什么)。您可能需要使用 diff 的选项来强制它不检查尽可能多的上下文行,以避免大量误报更改。

您可能最终需要编写您的程序来获取两个排序的输入文件,并在每个区域以锁步方式运行它们。当在 TODAY 文件中找到一个新区域时,这就是一个新区域。当在 YESTERDAY 文件中发现"new"区域(但在今天丢失)时,这就是删除。当在两个文件中找到“相同”区域时,然后比较 NS 记录。那要么没有变化,要么名称服务器发生变化。

关于c# - 查找 2 个巨大区域(文本)文件之间的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5391926/

相关文章:

c# - 使用 System.Reactive 订阅/监听流的 "side events"

c# - 仅在尝试使用 Word DocumentClass 时在产品中出现对象引用错误

c# - UWP CommandBar 动态大小和位置

c# - 我的 asp.net 核心项目中没有 .csproj 文件

c# - C#Windows Form应用程序中的连接字符串错误

c# - 如何为 SqlTransaction.Save() 设置超时?

javascript - JQuery 动画文本

c# - 使用事件存储客户端 API (.NET),如何写入流并将一个事件链接到另一个事件?

xml - XPath: contains(./text(), 'str' ) 将只查看第一个文本后代

php - 部分正则表达式不应该匹配。或者,最后