将URL存储到文件中以便可以快速访问它们

时间:2014-04-24 22:28:28

标签: c++ list file search hash

我有一个文件和大量的网址,这些网址被写入一个文件全部具有相同的结构加上一个类型为int的URL CheckSum。 stackoverflow.com写成:

    12534214214 http://stackoverflow.com

现在每次我想把一个url放到文件中我需要检查url是否不存在 然后我可以把它。 但用1 000 000个网址做这个需要花费太多时间:

    //list of urls
    list<string> urls;
    size_t hashUrl(string argUrl); //this function will hash the url and return an int
    file.open("anchors");
    //search for the int 12534214214 if it isn't found then write 12534214214 http://stackoverflow.com
    file.close();

问题1 : - 如何使用校验和搜索文件,以便搜索需要几毫秒?

问题2 : - 还有另一种存储这些网址的方法,以便能够快速访问这些网址吗?

谢谢,抱歉英语不好

1 个答案:

答案 0 :(得分:1)

(可能[1])你无法在纯文本文件中搜索一百万个URL,几毫秒&#34;。您需要将整个文件加载到内存中(当您这样做时,您也可以将其添加到一些合理的数据结构中,例如std::mapstd::unordered_map),或者使用某种为文件建立索引 - 例如,只有校验和以及文件中存储它们的位置有一个较小的文件。

纯文本文件的问题在于无法知道任何内容。一行可以是10个字节,另一个10000字节。这意味着您必须阅读每个字节,直到您感兴趣的位置。

当然,另一种选择是使用数据库库,SQLite等(或适当的数据库服务器,如MySQL),允许基于&#34;查询&#34;存储/检索数据。这隐藏了所有索引生成和其他此类问题,并且在搜索算法时已经过优化,并且具有用于读取/写入磁盘数据的智能缓存和优化代码等。

[1]如果所有URL都很短,那么文件可能足够小以便可以很好地缓存,并且代码可以编写得足够快以在几毫秒内线性扫描整个文件。但是,例如,每个URL平均50字节的文件将是50MB。如果每个字节需要10个时钟周期来处理,我们已经在130毫秒处理该文件,即使它在内存中直接可用。