Javascript 用于存储搜索速度优先的部分URL的数据结构
我们有一个包含部分URL(字符串)的大型数据库,例如:Javascript 用于存储搜索速度优先的部分URL的数据结构,javascript,data-structures,firefox-addon,computer-science,firefox-addon-sdk,Javascript,Data Structures,Firefox Addon,Computer Science,Firefox Addon Sdk,我们有一个包含部分URL(字符串)的大型数据库,例如: “example1.com” “example2.com/test.js” “/foo.js” 我们的软件侦听HTTP请求,并尝试在HTTP请求的完整url中查找数据库的一个部分url 因此,我们正在获取完整的URL(即:”),并尝试在其上匹配数据库的一个部分模式 如果我们只关心搜索速度,那么存储部分URL数据库的最佳数据结构是什么? 现在,我们要做的就是: 遍历部分url(字符串)的整个数据库,并使用(在javascript中)查
- “example1.com”
- “example2.com/test.js”
- “/foo.js”
现在,我们要做的就是:
- 遍历部分url(字符串)的整个数据库,并使用(在javascript中)查看完整url是否包含每个部分字符串
该软件是在Firefox上用Javascript编写的Firefox的扩展。您可以做以下几件事:
- 不要在客户端处理URL。JavaScript会很慢,尤其是当您有很多URL时。您可以创建一个REST API并将URL作为查询参数传入以进行匹配,即
。将繁重的工作和内存使用放在服务器端也会减少您的工作量ndwidthdomain.com/API/?URL=…
- 将URL引导到RAM中,而不是每次都从数据库中读取。在这种情况下,类似的方法可以很好地工作
- 一旦进入ram,结构将工作得最好,因为您正在进行简单的匹配。无论您做什么,都要避免字符串比较
如果您遵循以下几条建议,您将获得显著的加速。希望这能有所帮助。您可以做以下几件事:
- 不要在客户端处理URL。JavaScript会很慢,尤其是当您有很多URL时。您可以创建一个REST API并将URL作为查询参数传入以进行匹配,即
。将繁重的工作和内存使用放在服务器端也会减少您的工作量ndwidthdomain.com/API/?URL=…
- 将URL引导到RAM中,而不是每次都从数据库中读取。在这种情况下,类似的方法可以很好地工作
- 一旦进入ram,结构将工作得最好,因为您正在进行简单的匹配。无论您做什么,都要避免字符串比较
如果您遵循这几条建议,您将获得显著的加速。希望这会有所帮助。假设您的部分字符串仅为域名和/或页面名称,您可以尝试从URL的末尾开始生成所有可能的组合:
http://www.example.com/blah.js?foo=bar
blaj.js
example.com/blah.js
www.example.com/blah.js
然后散列所有组合,将它们存储在一个数组中,并尝试在另一个数组中查找其中的任何组合,该数组包含数据库中所有部分字符串的散列
注:
如果您想匹配url中的任何字符串,比如example.com
中的ample
,它在存储方面就变得不那么复杂了,因为url中的所有随机字符串都是
其中,n
是url的长度,k
是要查找的字符串的长度。根据url的最大合理长度是2000个字符。并且假设要匹配随机字符串,则k
的值从1到2000不等,这将导致从url和生成大量哈希从1到2000年,每个k
的n大于k
。
或者更准确地说-不同的哈希值假设您的部分字符串只是域名和/或页面名称,您可以尝试从URL的末尾开始生成所有可能的组合:
http://www.example.com/blah.js?foo=bar
blaj.js
example.com/blah.js
www.example.com/blah.js
然后散列所有组合,将它们存储在一个数组中,并尝试在另一个数组中查找其中的任何组合,该数组包含数据库中所有部分字符串的散列
注:
如果您想匹配url中的任何字符串,比如example.com
中的ample
,它在存储方面就变得不那么复杂了,因为url中的所有随机字符串都是
其中,n
是url的长度,k
是要查找的字符串的长度。根据url的最大合理长度是2000个字符。并且假设要匹配随机字符串,则k
的值从1到2000不等,这将导致从url和生成大量哈希从1到2000年,每个k
的n大于k
。
或者更准确地说,不同的哈希值是固定的部分URL类型的数量(如示例中所示,它只是域和路径)?在这种情况下,我会使用散列数组,分别检查分析的URL的每个区块与相应的散列。为什么不记录每个区块的点击数并按此对搜索进行排序?数据库是否适合RAM?部分字符串是否仅为域名或页面名(example.com或foo.js或bar.html)?@raina77ow:是的,我们数据库中的部分URL的数量是sub-domain.domain,domain,sub-domain.domain/path,domain/path,path本身。部分URL的类型数量是固定的吗(如示例所示,仅为domain和path)?在这种情况下,我会使用散列数组,分别检查分析的URL的每个区块与相应的散列。为什么不记录每个区块的点击数并按此对搜索进行排序?数据库是否适合RAM?部分字符串是否仅为域名或页面名(example.com或foo.js或bar.html)?@raina77ow:是的,我们数据库中的部分URL的数量是sub-domain.domain,domain,sub-domain.domain/path,domain/path,path本身。该软件是一个浏览器扩展,因此每个HTTP请求都在客户端实时处理。因此,我们无法使用服务器端。关于哈希表,您会怎么做关于我们有足够的时间