我在项目中面临设计问题。
问题
我需要向solr查询从我们的列表中提取的一些参数的所有可能组合(或多或少2千万),以测试它们至少给出1个结果。如果没有,则将该组合插入黑名单(用于统计分析和站点地图创建)
我现在怎么做
嵌套for循环以组合参数(从python列表中提取)并将它们传递给一个方法(我在生产环境中用来查询网站中的数据库),测试0结果。如果它为0,则在黑名单中插入一种方法
没有涉及线程
我喜欢这个怎么样
我想将所有组合放在一个队列中,让一个线程对象拉出它们,查询和插入,以获得更好的性能
我遇到的问题
slowliness :单线程,现在需要花费很多时间(如果完成的话)
连接由peer [104] 重置:这是一段时间后被solr抛出的错误(我增加了池大小,但没有任何变化)这是最经常的(并且很烦人)错误,此刻。
python hanging :我用超时装饰器解决了(这不是一个正确的解决方案,但至少它可以帮助我完成整个处理并暂时快速测试输出。我每当我能找到一个聪明的解决方案时,我都会放弃它。
队列最大大小:队列对象最多可包含32k个元素,因此不适合我的数字
我使用的是什么
python 2.7
MySQL的
Apache的solr的
sunburnt(与solr的python接口)
linux box
我不需要任何代码调试,因为我宁愿抛弃我为新的开始做的事情,而不是一遍又一遍地修补它......“错误的试验”不是我喜欢的。
我希望您能够以正确的方式设计这些建议。此外,链接,网站,指南也非常受欢迎,因为我使用这种脚本的经验正在建立起来。
先谢谢你的帮助!如果您不明白某事,请问,如果需要,我会回复/更新帖子!
基于某些答案的编辑(将保持此更新)
我可能会删除多处理lib的python线程:这可以解决我的性能问题
基于分而治之的构造方法:这应该在我的参数构造中添加一些逻辑,而不需要任何暴力攻击
我还需要知道:我可以在哪里存储我的组合来提供工作线程?也许这不再是一个问题,因为分而治之的方法可以让我生成运行时组合并在工作线程之间拆分它们。
NB:我现在不会'接受任何答案,因为我想暂时保留这篇文章,只是为了收集越来越多的想法(不仅是为了我,也许是为了将来参考其他人,因为这是通用的性质)再次感谢所有人!
答案 0 :(得分:3)
而不是蛮力,改为使用divide-and-conquer方法,同时跟踪每次搜索的点击次数。如果细分为某些组合,其中一些组将为空,因此您可以一次性删除多个子树。将遗失的参数添加到剩余的搜索中并重复,直到完成为止。它需要更多的簿记,但搜索次数更少。
答案 1 :(得分:1)
您可以使用stdlib“多处理”模块以使多个子进程与您的组合一起使用 - 这比Python的线程更好,并且至少允许配置中的每个逻辑CPU核心同时运行。
这是一个极简主义的例子:
import random
from multiprocessing import Pool
def a(a):
if random.randint(0, 100000) == 0:
return True
return False
# the number bellow should be a equal to your number of processor cores:
p = Pool(4)
x = any(p.map(a, xrange(1000000)))
print x
因此,这需要进行1000万次测试,分为4个“工作”进程,没有扩展问题。
但是,考虑到您所获得的错误消息的性质,尽管您没有明确说明,但您似乎正在运行带有Web界面的应用程序 - 并等待所有处理完成后再渲染结果到浏览器。对于长时间运行的计算,这不会有效 - 您最好在一个单独的进程中执行所有计算,而不是服务于Web界面的服务器进程,并使用一些小的javascript通过异步请求更新Web界面。这样你就可以避免任何“对等连接重置”错误。