【发布时间】:2023-04-03 20:51:01
【问题描述】:
我在项目中遇到了设计问题。
问题
我需要使用从我们的列表中提取的某些参数的所有可能组合(或多或少 2000 万)查询 solr,以测试它们是否至少给出 1 个结果。如果他们不这样做,则将该组合插入黑名单(用于统计分析和站点地图创建)
我现在是怎么做的
嵌套for循环以组合参数(从python列表中提取)并将它们传递给测试0结果的方法(我在生产环境中用于查询网站中的数据库)。如果为 0,则有一个方法插入到黑名单中
不涉及线程
我想怎么做
我想把所有的组合放在一个队列中,让一个线程对象拉它们,查询和插入,以获得更好的性能
我遇到了什么问题
缓慢:作为单线程,现在需要很多时间才能完成(何时以及是否完成)
对等点重置连接[104]:这是 solr 在查询一段时间后抛出的错误(我增加了池大小,但没有任何变化)这是最经常发生的(也很烦人)错误,目前。
python 挂起:我用超时装饰器解决了这个问题(这不是一个正确的解决方案,但至少它可以帮助我完成整个处理并暂时获得快速测试输出。我'只要我能找到一个聪明的解决方案,就会放弃这个)
队列最大大小:一个队列对象最多可以包含 32k 个元素,所以它不适合我的数字
我在用什么
python 2.7
mysql
apache-solr
sunburnt(solr 的 python 接口)
linux 盒子
我不需要任何代码调试,因为我宁愿放弃我为重新开始所做的事情,而不是一遍又一遍地修补它......“试错”不是我喜欢的。
我希望您能想到的每一个建议都能以正确的方式设计。也非常欢迎链接、网站、指南,因为我对这种脚本的经验是在我工作的过程中积累起来的。
提前感谢大家的帮助!如果您有不明白的地方,请问,如果需要,我会回答/更新帖子!
根据一些答案进行编辑(将保持更新)
我可能会放弃多处理库的 python 线程:这可以解决我的性能问题
基于分而治之的构造方法:这应该在我的参数构造中添加一些逻辑,而不需要任何蛮力方法
我还需要知道什么:我可以在哪里存储我的组合以供工作线程使用?也许这不再是一个问题,因为分而治之的方法可以让我在运行时生成组合并在工作线程之间拆分它们。
注意:我暂时不会接受任何答案,因为我想暂时保留这篇文章,只是为了收集越来越多的想法(不仅对我来说,而且可能供其他人将来参考,因为这是通用性质)
再次感谢大家!
【问题讨论】:
-
嗨 - 什么是“所有可能的组合”?您是否需要取成对的值 - 将它们所有可能的对(约 20 百万 ** 2 次迭代) - 或者您是否需要所有可能的子集组合(2000 万的阶乘)?无论哪种方式,这在非量子计算机中似乎都是一件困难的事情。
-
哦..抱歉 - 看起来 2000 万已经是您要测试的组合总数了。
-
是的,2000 万是完整的查询集(未来可能会增长)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python、solr 和海量查询:需要一些建议 - Python技术站