【问题标题】:storing urls to a file so they can be reachable quickly将 url 存储到文件中,以便可以快速访问它们
【发布时间】:2014-06-10 10:53:04
【问题描述】:

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

    12534214214 http://*.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://*.com
    file.close();

question1:-如何使用校验和在文件中搜索,这样搜索将花费几毫秒?

question2:-是否有另一种存储这些 url 的方法,以便可以快速访问它们?

谢谢,抱歉英语不好

【问题讨论】:

  • 使用数据库。 SQLite 和 BDB 应该随时可用。
  • 大家好,感谢您的回复,我想使用数据库,但我需要按校验和排序,这样我就可以轻松搜索,数据库可以吗? @gha.st 你能解释一下如何通过校验和对文件进行排序吗?ty 提前

标签: c++ list file search hash


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗨垫子,你的回答,我说的是把这些 URL 存储在一个文件中,该文件将按校验和排序,所以我可以进行二进制搜索。有可能吗?
  • 我刚刚编辑了文件以解释如果它是纯文本文件,则不可能知道每个条目的位置。所以我建议最合理的方法是简单地将整个文件加载到内存中(在相当现代的台式机中,这应该没有问题)。
  • 回答你的问题,只是最后一个问题,我读到了二进制文件和你可以快速搜索其中的内容的方法,你怎么看?
  • 如果您有固定大小的记录,那么文本或二进制文件将可以在二进制搜索中进行搜索。由于磁盘访问速度的原因,它可能仍然无法很好地实现您的性能目标(如果所有记录都足够大以容纳非常长的 URL,则文件将显着增大)。如果您不需要它是文本文件,请使用数据库库/服务器。