c++ - 将 url 存储到文件中,以便可以快速访问它们

标签 c++ list file search hash

我有一个文件和大量的 url,这些 url 被写入一个文件,所有这些都具有相同的结构加上一个 int 类型的 url CheckSum。 stackoverflow.com 写成:

    12534214214 http://stackoverflow.com

现在每次我想将 url 放入文件时,我都需要检查 url 是否不存在 然后我可以把它。 但是使用 1 000 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::mapstd::unordered_map),或者对文件使用某种索引——例如,有一个较小的文件,其中只有校验和以及它们在文件中的存储位置。

纯文本文件的问题是没有办法知道任何东西在哪里。一行可以是 10 个字节,另外一行可以是 10000 个字节。这意味着您实际上必须读取您感兴趣的每个字节。

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

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

关于c++ - 将 url 存储到文件中,以便可以快速访问它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281015/

相关文章:

c++ - 在 C++ 中处理多维数组长度

c++ - 如何仅使用 SSE2 对 double/int 进行 floor/int?

c++ - 为什么 MSVC 在覆盖具有正确签名的函数时会产生 C3668 错误?

c++ - 读取整数的程序,只要它们交替为正负。 C++

python - 使用具有偏好和唯一性的 random.choice()

file - 什么是 .meta 文件,为什么 Unity 会为我的所有 Assets 创建它们?

Python 列表函数

c# - 如何从每个内部列表中获取所需的元素?

actionscript-3 - 如何将文件放入\保存到应用程序目录中? (土坯空气)

c++ - 从文件末尾检索字符串时失败