gpt4 book ai didi

php - 优化具有大量线程的 PHP 算法?

转载 作者:可可西里 更新时间:2023-10-31 23:46:20 25 4
gpt4 key购买 nike

作为基于 Laravel 的应用程序的一部分,我正在尝试编写一个 PHP 脚本来获取某些数据,这些数据不断更新,来自在网络上谈论某些产品,确切地说是书籍。

问题:

书籍由 ISBN 标识,ISBN 是一个 10 位数字标识符。前 9 位可以是 0-9,而最后一位可以是 0-9 或 X。但是,最后一位是根据前 9 位计算的校验位,因此实际上只有 1 位可能的数字最后一个地方。

既然如此,我们得出:

10*10*10*10*10*10*10*10*10*1 = 1,000,000,000

数字正确的 ISBN。如果我将搜索限制在英语书籍上,我可以做得更好,因为它们的第一个数字只包含 0 或 1。因此我会得到:

2*10*10*10*10*10*10*10*10*1 = 200,000,000

数字正确的 ISBN。

现在对于每个 ISBN,我有 3 个http 请求来获取数据,每个请求大约需要 3 秒才能完成。因此:

3seconds*3requests*200,000,000ISBNs = 1,800,000,000 seconds
1,800,000,000seconds/60seconds/60minutes/24hours/365days = ~57 years

希望在57年后,不再有书这种东西,这个算法也将过时。

实际上,由于我关注的数据在不断变化,要使该算法有用,它必须在短短几天内完成每次传递(理想情况下为 2 - 7 天)。

那么问题是如何优化这个算法,让它的运行时间从 57 年缩短到只有一周?

可能的解决方案:

1) 您会注意到的第一件事是,虽然有 200,000,000 个可能的 ISBN,但实际存在的 ISBN 几乎没有那么多,这意味着该算法的大多数将 < strong>花时间对错误的 ISBN 进行http 请求(我可以在第一次失败的 http 请求后转到下一个 ISBN,但仅此一项并不能显着缩短时间)。因此,解决方案 1 将是获取/购买/下载一个已经包含正在使用的 ISBN 列表的数据库,从而显着减少要搜索的 ISBN 数量。 p>

我对解决方案 1问题是不断有新书出版,我希望算法再次运行时能找到新书。使用现有书籍的数据库只适用于创建数据库时最新的书籍。 (一个潜在的解决方案是不断更新他们的数据库并让我每周下载一次的服务,但这似乎不太可能,而且我真的希望通过编程来解决这个问题!)

2) 虽然此算法需要很长时间才能运行,但大部分时间它实际上只是闲置等待 http 响应。因此,一种选择似乎是使用线程

如果我们算一下,我认为等式应该是这样的:

(numISBNs/numThreads)*secondsPerISBN = totalSecondsToComplete

如果我们隔离 numThreads:

numThreads = (numISBNs * secondsPerISBN) / totalSecondsToComplete

如果我们的阈值是一周,那么:

totalSecondsToComplete = 7days * 24hrs * 60min * 60sec = 604,800seconds
numISBNs = 200,000,000
secondsPerISBN = 3

numThreads = (200,000,000 * 3) / 604,800
numThreads = ~992

因此 992 线程必须同时运行才能工作。这是在 DigitalOcean 服务器上运行的合理数量的线程吗?我的 mac 现在说它运行了 2000 多个线程,所以这个数字实际上是可以管理的。

我的问题:

1) 992 是否是在 DigitalOcean 服务器上运行的合理数量的线程?
2) 由于每个 http 请求都完全独立于任何其他请求,是否有更有效的方法来异步执行此算法?在等待所有 http 请求返回时,让 CPU 保持忙碌的最佳方法是什么?
3) 是否有我应该寻找的特定服务可能有助于实现我正在寻找的目标?

最佳答案

保留一个ISBN的DB,不断爬取保持更新,类似于google所有网页

分析ISBN生成逻辑,尽量避免获取不可能的ISBN

在爬行级别,您不仅可以拆分成不同的线程,还可以将它们拆分为多个服务器,每个服务器都可以访问数据库服务器,该服务器专用于数据库,不会因爬行而产生开销

如果可以提高性能,您也可以使用某种网络缓存,例如谷歌缓存或网络存档

对于 Web 服务来说 3 秒很多,您确定没有可以在更短时间内回答您的服务吗?搜索一下,也许

如果你设法列出某个日期所有出版的书籍,你可以尝试只抓取该日期的新书,通过只找到它们的一些来源,这种刷新会比搜索任何书籍快得多

关于php - 优化具有大量线程的 PHP 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com