-1

好的,这里是简单的交易:我蜘蛛网络(所有类型的数据,博客/新闻/论坛),因为它出现在互联网上。然后我处理这个提要并对处理后的数据进行分析。爬虫没什么大不了的。随着互联网获取新数据,我几乎可以实时获取它。处理是一个瓶颈,它涉及一些计算量大的算法。

我正在寻求制定一个策略来安排我的蜘蛛。最大的目标是确保作为最终结果生成的分析尽可能多地反映最近输入的影响。开始想一想,显而易见的目标是确保数据不会堆积。我通过蜘蛛获取数据,传递给处理代码,等到处理结束,然后蜘蛛更多。这次带来了我在等待处理结束时出现的所有数据。好的,这是一个非常广泛的想法。

你们中的一些人可以分享您的想法,可能会大声思考。如果你是我,你会想到什么。我希望我的问题是有意义的。顺便说一句,这不是搜索引擎索引。

4

1 回答 1

1

您似乎希望使处理器不会落后于蜘蛛太远。我想你也希望能够扩大规模。

我的建议是使用客户端/服务器 SQL 数据库实现队列。MySQL 可以很好地用于此目的。


设计目标

  • 防止蜘蛛远远领先于处理器
  • 允许蜘蛛和处理器之间的权力平衡(保持每个忙)
  • 尽可能保持数据最新
  • 根据需要扩展和扩展

队列: 创建一个队列以在处理蜘蛛之前存储来自蜘蛛的数据。这可以通过多种方式完成,但听起来 IO 并不是您的瓶颈。

一个简单的方法是创建一个具有这种布局的 SQL 表:

TABLE Queue
    Queue_ID int unsigned not null auto_increment primary key
    CreateDate datetime not null
    Status enum ('New', 'Processing')
    Data blob not null

# pseudo code
function get_from_queue()
    # in SQL
    START TRANSACTION;
    SELECT Queue_ID, Data FROM Queue WHERE Status = 'New' LIMIT 1 FOR UPDATE;
    UPDATE Queue SET Status = 'Processing' WHERE Queue_ID = (from above)
    COMMIT
    # end sql

    return Data# or false in the case of no records found

# pseudo code
function count_from_queue()
    # in SQL
    SELECT COUNT(*) FROM Queue WHERE Status = 'New'
    # end sql
    return (the count)

蜘蛛:

所以你有多个蜘蛛进程..他们每个人都说:

if count_from_queue() < 10:
    # do the spider thing
    # save it in the queue
else:
    # sleep awhile

repeat

这样,每只蜘蛛要么在休息,要么在。该决定(在这种情况下)基于待处理的待处理项目是否少于 10 个。您可以根据自己的目的进行调整。


处理器

所以你有多个处理器进程。他们每个人都说:

Data = get_from_queue()
if Data:
    # process it
    # remove it from the queue
else:
    # sleep awhile

repeat

这样,每个处理器要么处于休息状态,要么处于处理状态。


总结: 无论您是在一台计算机上运行,​​还是在 20 台计算机上运行,​​队列都将提供您需要的控制,以确保所有部分同步,并且不会彼此领先太远。

于 2009-02-15T04:54:37.483 回答