我有一个文件和大量的url,这些url被写入一个具有相同结构的文件,再加上类型为int的url CheckSum。stackoverflow.com被写成:
12534214214 http://stackoverflow.com
现在,每次我想把一个url放进文件中,我都需要检查这个url是否不存在然后我可以把它放进去。但是用1000 000个url做这件事需要太多时间:
//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:有没有其他方法可以存储这些URL,以便快速访问它们?
谢谢,很抱歉英语不好
(很可能[1])不可能在"几毫秒"内在纯文本文件中搜索一百万个URLS。你需要将整个文件加载到内存中(当你这样做时,你也可以将其加载到一些合理的数据结构中,例如std::map
或std::unordered_map
),或者对文件使用某种索引-例如,有一个较小的文件,只有校验和和和它们存储在文件中的位置。
纯文本文件的问题是无法知道任何东西在哪里。一行可以是10个字节,另一行可以为10000个字节。这意味着你必须读取每个字节,直到你感兴趣的点
当然,另一种选择是使用数据库库、SQLite等(或适当的数据库服务器,如MySQL),允许基于"查询"存储/检索数据。这隐藏了所有的索引生成和其他此类问题,并且在搜索算法方面已经进行了优化,还具有智能缓存和优化的代码,用于向磁盘读取/写入数据等。
[1] 如果所有URLS都很短,那么文件可能足够小,可以很好地缓存,并且代码可以写得足够快,可以在几毫秒内线性扫描整个文件。但是,比如说,一个平均每个URL有50个字节的文件将是50MB。如果每个字节需要10个时钟周期来处理,那么我们处理文件的时间已经达到130ms,即使它在内存中直接可用。