Algorithm 存储URL列表的有效方法

Algorithm 存储URL列表的有效方法,algorithm,data-structures,compression,finite-automata,data-compression,Algorithm,Data Structures,Compression,Finite Automata,Data Compression,我需要存储万亿个URL列表,其中每个URL列表将包含约50个URL。 对于磁盘存储,压缩它们的最节省空间的方法是什么 我想先删除无用的信息,比如“http://”,然后构建一个最小有限状态自动机并保存它 另一个选项是构建一个逗号分隔的URL字符串,并使用常规压缩(如GZIP或BZ2)压缩该字符串 如果我不关心速度,哪种解决方案会产生最好的压缩效果。在调查之后,似乎只使用GZIP压缩比只使用紧凑的有向无环字图要好 考虑到URL的数量以及大多数URL使用或多或少相同的结构和命名模式,我会使用索引和标

我需要存储万亿个URL列表,其中每个URL列表将包含约50个URL。 对于磁盘存储,压缩它们的最节省空间的方法是什么

我想先删除无用的信息,比如“http://”,然后构建一个最小有限状态自动机并保存它

另一个选项是构建一个逗号分隔的URL字符串,并使用常规压缩(如GZIP或BZ2)压缩该字符串


如果我不关心速度,哪种解决方案会产生最好的压缩效果。

在调查之后,似乎只使用GZIP压缩比只使用紧凑的有向无环字图要好

考虑到URL的数量以及大多数URL使用或多或少相同的结构和命名模式,我会使用索引和标记器。 首先使用标记器收集尽可能多的单词,并将它们保存在索引中。然后,您可以将每个令牌替换为其在列表中的索引:

(42字节)==将为您提供

http://=>1 www.=>2 google.com=>3 搜索=>4 你好=>5 世界=>6

URL将变成:1,2,3,“/”,4,“?”,“q”,“=”,5,“+”,6

考虑到很多URL都是一个普通大域名的子域,并且大多数URL都使用相同的普通英语单词(想想所有关于我们的页面或职业…),你可能最终会得到一个不太大的索引(英语中大约有50000个常用单词,法语中有70000个)

然后可以压缩索引和标记化URL以获得更多空间


解析URL和建立索引有O(n)和O(nlogn)算法。

需要对列表执行哪些操作?这可能会为数据结构的选择提供信息。不,我的意思是我需要存储大量的列表,其中每个列表大约有50个URL。我认为最好的选择是尝试一系列结果,并对它们进行分析,看看哪些结果提供了最佳的空间利用率。一个标准的压缩算法可能会在这方面做得很好,尽管一个更高级的结构,比如通过压缩器运行的最小状态DFA(顺便说一下,在本文中称为DAWG)可能会更好。你是否意识到即使你达到了不太可能的10:1的压缩比,这些列表也会发出半PB的声音?只是为了确保,因为您可能已经意识到了这一点。我想压缩的按位Trie会很有用。这不是特别好的压缩。假设索引是32位整数,则压缩的url索引为24字节,单个字符多4字节。所以压缩比是3:2。一点也不好。你可以用一个固定的赫夫曼编码器做得更好。如果你考虑一个URL是的,但是考虑一下每个整数将出现数百或数千个时间的事实(想想单词“和”或“hello”)。URL越多,压缩率就越好。这实际上是一种非常有效的压缩算法,但当然可以对其进行改进。我只是给出了一个通用的想法,比如使用一个全局字典来存储主机,例如:“它让我用一个4字节的id来替换它,这样每个条目都变成(4字节的主机id)+(20字节的字符串“search?q=hello+world”)。然后可以使用GZIP进一步处理该列表以压缩路径。