我有一个文件和大量的网址,这些网址被写入一个文件全部具有相同的结构加上一个类型为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 : - 还有另一种存储这些网址的方法,以便能够快速访问这些网址吗?
谢谢,抱歉英语不好
答案 0 :(得分:1)
(可能[1])你无法在纯文本文件中搜索一百万个URL,几毫秒&#34;。您需要将整个文件加载到内存中(当您这样做时,您也可以将其添加到一些合理的数据结构中,例如std::map
或std::unordered_map
),或者使用某种为文件建立索引 - 例如,只有校验和以及文件中存储它们的位置有一个较小的文件。
纯文本文件的问题在于无法知道任何内容。一行可以是10个字节,另一个10000字节。这意味着您必须阅读每个字节,直到您感兴趣的位置。
当然,另一种选择是使用数据库库,SQLite等(或适当的数据库服务器,如MySQL),允许基于&#34;查询&#34;存储/检索数据。这隐藏了所有索引生成和其他此类问题,并且在搜索算法时已经过优化,并且具有用于读取/写入磁盘数据的智能缓存和优化代码等。
[1]如果所有URL都很短,那么文件可能足够小以便可以很好地缓存,并且代码可以编写得足够快以在几毫秒内线性扫描整个文件。但是,例如,每个URL平均50字节的文件将是50MB。如果每个字节需要10个时钟周期来处理,我们已经在130毫秒处理该文件,即使它在内存中直接可用。