Algorithm 确定“最后一个”的最快方法;记录";。。理想的情况是并行。。。(有差距)

Algorithm 确定“最后一个”的最快方法;记录";。。理想的情况是并行。。。(有差距),algorithm,language-agnostic,search,Algorithm,Language Agnostic,Search,我有一个数据挖掘应用程序,可以访问一个网站,以检索个人记录[另一个网站仍由我的公司运行,但没有用于访问它的API]。我知道第一条记录是“1”,但(没有人为干预)我不知道最后一条记录。按顺序处理数据可能需要一段时间(例如,4000条记录=大约45分钟)。为了改善用户体验,我想快速确定完成百分比 理想情况下,我会实现类似于二进制搜索的功能,以从服务器获取最少的数据来确定最后一条记录。我碰巧知道这些记录是由人类创建的,因此,如果今天总共有4000条记录,那么明天很可能是4000-4020条,但我不想在

我有一个数据挖掘应用程序,可以访问一个网站,以检索个人记录[另一个网站仍由我的公司运行,但没有用于访问它的API]。我知道第一条记录是“1”,但(没有人为干预)我不知道最后一条记录。按顺序处理数据可能需要一段时间(例如,4000条记录=大约45分钟)。为了改善用户体验,我想快速确定完成百分比

理想情况下,我会实现类似于二进制搜索的功能,以从服务器获取最少的数据来确定最后一条记录。我碰巧知道这些记录是由人类创建的,因此,如果今天总共有4000条记录,那么明天很可能是4000-4020条,但我不想在我的数据收集应用程序中引入这种假设,因为这需要用户进行某种管理

  • 确定“最后一条记录”的最快方法是什么
  • 使问题复杂化的是,删除的记录看起来与尚未创建的记录相同!虽然这种情况非常罕见,但确实会发生。我已经确定了一条规则,在最后一次成功后检索五次连续失败,以指示最后一条记录
  • 我已经有了一个很好的顺序实现,但由于处理记录的成本,我确定可以/更快地并行检索它们(例如,一次检索8个)
  • 这种“最后一个索引”搜索是否有既定的模式/算法(间隙有限)?虽然我可以积极(在一定程度上)使现有应用程序并行(例如,可能快8倍),但如何快速确定用户等待时间

  • 我可以让用户只等待他们当前等待时间的八分之一
  • 我可以花费最初的精力查找最后一条记录,然后重新填充内容以完成操作
  • 具体实现信息,我正在用C#实现它,并且可以访问LINQ,但我觉得这是一个独立于语言的算法


    编辑我已经为大多数用户提供了一种缓存机制,但现有数据可能会经常更改(每天更改5%-10%),因此缓存机制可能很快就会过时。我希望避免需要中央缓存,这样所有用户都不会受到这些更改的影响,此外,还有多个项目,缓存可能需要访问“网站”,我甚至可能没有访问权限或我开发的服务-我更希望这留在“用户域”内。因此,有时有必要尽快进行“全面更新”。

    正如您所说,您可以使用类似二进制搜索的方法。您正在尝试查找有效记录索引(n)的最小上界。从n=1开始,然后加倍,直到结束。n现在是一个上限。现在在n/2和n之间进行二进制搜索,将其减少到最小上界


    很明显,这可以调整为一次下拉8条或更多记录(如果要发现已经结束,唯一的方法是查看足够多的相邻空条目,那么这听起来无论如何都是必要的)。

    我认为您在这里没有很好地解释自己。这听起来像是你在查询另一个网站的数据,一次请求一条记录,直到你提取了全部4000条(这不是一个很大的数量)。我只需要创建一个记录的本地缓存(在我自己的数据库中),并在一天中定期轮询网站以获取新记录。然后,获取最后一条记录就变得微不足道了。如果没有任何奇特的算法,数据库将立即返回第4000条记录。虽然我可以提取记录并创建本地缓存(事实上我已经这样做了),但记录可以而且确实会改变。虽然我有一个完全独立的更新机制,但有时有必要刷新所有更新。这就是用户突然感到不安的地方,对数据的查询需要10毫秒,突然需要45分钟!这些记录或多或少是静态的吗?你说如果你今天有4000条记录,明天可能会有4000到4020条记录——你能简单地把currecindex存储在某个地方,然后从那里开始获取记录吗,或者说,(currecindex-20)?这会很快给你最后一条记录,不是吗?虽然大多数记录都是静态的,但每天可能会有5-10%的变化,我宁愿将我单独进行的缓存与“完全更新”分离,这是问题背后的理由。由于序列中存在差距,找到第一条丢失的记录可能只是偶然发现了一个缺口。因此,一旦找到了可能的上限,我就需要按最大间隙大小前进,以确保序列不会再次开始。假设它重新启动,我需要继续向前看,否则,正如你所说,回溯以找到真正的上限。我多么希望web应用程序开发人员实现了一个“ThisRecordwasdelected”页面,而不是通用的“no-ThisPage!”。