Linux:比较大文件

Linux:比较大文件,linux,database,perl,large-files,Linux,Database,Perl,Large Files,我每天都在下载.COM区域文件。这是世界上所有.COM域及其主名称服务器的列表 区域文件的示例: DAYTONOHIOJOBS NS NS1.HOSTINGNET DAYTONOHIOJOBS NS NS2.HOSTINGNET DAYTONOHIOMAP NS NS1.HOSTINGNET DAYTONOHIOMAP NS NS2.HOSTINGNET DAYTONOHIONEWS NS NS1.HOSTINGNET DAYTONOHIONEWS NS NS2.HOSTINGNET 为了节省

我每天都在下载.COM区域文件。这是世界上所有.COM域及其主名称服务器的列表

区域文件的示例:

DAYTONOHIOJOBS NS NS1.HOSTINGNET
DAYTONOHIOJOBS NS NS2.HOSTINGNET
DAYTONOHIOMAP NS NS1.HOSTINGNET
DAYTONOHIOMAP NS NS2.HOSTINGNET
DAYTONOHIONEWS NS NS1.HOSTINGNET
DAYTONOHIONEWS NS NS2.HOSTINGNET
为了节省磁盘空间,您可以看到.COM已从域名中删除(反正都是.COM)。 名称服务器也是如此(如果以.COM结尾,则已被删除)

这个区域文件大约有270000000行和9GB

我的目标是监视特定的名称服务器。每天我都想要一个包含该特定名称服务器的所有域的列表,但也需要一个包含该名称服务器的所有新域的列表(如中所示:昨天该域还没有该名称服务器)

我编写了一个perl脚本来打开并加载“昨天”数据库,然后打开“今天”数据库并循环和比较。但这需要几个小时和大量的内存


做这件事最好的方法是什么?

根据我所知道的判断,我将如何做:

让脚本读取第一个文件。对于与感兴趣的名称服务器对应的每一行,将条目添加到hashmap中

让脚本读取第二个文件。对于与感兴趣的名称服务器对应的每一行,检查条目是否在hashmap中。如果不是,那就是新的。如果是,则保持不变-将其从hashmap中删除

最后,仍然留在hashmap中的所有条目都被删除


这确实假设具有此特定名称服务器域的hashmap适合内存,但对于合理的计算机和合理的名称服务器,这似乎是一个合理的假设…

您可以
grep
today和yestarday文件与名称服务器的行比较两个结果。(
grep
-命令行unix工具)


您可以保留压缩文件(gzip)并使用
zgrep
进行初始grep。

您可以对区域文件的分类进行假设吗?压缩方案的一个重要问题:特别是在我们现在几乎不受限制的TLD世界,如何区分名为ns3.foobar.com的名称服务器和从名为ns3.foobar的名称服务器中删除的.com名称服务器?它的排序方式并不总是相同的。关于比较ns3.foobar.com和ns3.foobar.*-这有点不相关(对我来说),因为我监视的名称服务器只有一个.com扩展名,如果它有其他扩展名,它就不是我需要的。解决这个问题的自然方法是将大文件的相关部分保存到较小的文件中,例如,
20141031\u NS1.HOSTINGNET
。然后比较较小的文件。如果我们能看到您已经拥有的代码,就可以更容易地提出加快流程的建议。这就是我一直在做的。在hashmap中添加旧文件,然后在新文件上循环。问题是,我正在监视世界上最大的域名服务器,它拥有数百万个域名,过了一段时间我的内存就用完了(除非我添加40gb的RAM,但这很昂贵)。如果内存是主要问题,那么有几个选项可以供您选择:1)运行几次,每次仅处理以某个字母开头的域(或对数据进行分区),2)使用数据库,3)构建二叉树,以便有效地“a.aaalonglonglong”和“b.bbblonglonglong”将导致“longlong”只占用内存一次(尽管这需要做出明智的决策,以避免指针占用的空间超过节省的空间)。如果允许“错误”,您也可以只比较校验和。