为什么Scrapy会不断增加内存使用量?

时间:2019-08-04 00:04:27

标签: python scrapy

我有一个使用scrapy的抓取项目,它将继续运行,这意味着完成后,我有一个脚本使其再次运行。

完成一个回合大约需要10个小时,并且内存增加了100mb,并且之后没有释放。

我使用<MDRectangleFlatIconButton> ... theme_text_color: 'Custom' text_color: root.theme_cls.primary_color BoxLayout: ... MDIcon: ... MDLabel: .. theme_text_color: root.theme_text_color text_color: root.text_color markup: root.markup <MDRoundFlatIconButton> ... theme_text_color: 'Custom' text_color: root.theme_cls.primary_color BoxLayout: ... MDIcon: ... MDLabel: ... theme_text_color: root.theme_text_color text_color: root.text_color markup: root.markup 有助于提高速度,但解决内存问题却没有运气。

这就是我要买的蜘蛛

JOBDIR

我看不到有什么东西泄漏内存。.已经花了我几天时间,但是没有运气。.

编辑:

我刚发现:KivyMD GitHub

我想这可能是python问题...

3 个答案:

答案 0 :(得分:0)

我推荐的一件事就是改变

with open(suburbLinkFileName) as f:
    data = json.load(f)
    for link in data:
        all_suburb_links.append(link['result'])

with open(suburbLinkFileName) as f:
    data = json.load(f)
    all_suburb_links = tuple(link['result'] for link in data)

因为tuplelist占用的内存少

答案 1 :(得分:0)

我认为内存使用量的增加是RFPDupeFilter的结果
Scrapy使用此类过滤重复的请求
默认情况下,RFPDupeFilter在python SHA1实例中存储您的Web爬网程序访问的所有URL的set哈希值
。 (独特元素的无序集合)

此数据结构会在抓取过程中定期增加内存使用量。

理论上,每个SHA1哈希-40个十六进制数字(20个字节)
但是根据我在此实现中的本地测试,它以40个符号存储为str
此哈希上的sys.getsizeof函数-89个字节(在Win10 x64上为python3.6)

如果您访问了270k的URL,我们可以估计使用24030000(〜23兆字节)来存储所有SHA1哈希。

我没有计算set的哈希表的大小(需要快速过滤set中的非唯一元素)

如果您使用JOBDIR-从requests.seen文件中抓取加载/更新dupefilter数据。


我想存储所有这些dupefilter数据所需的实际内存可能超过100mb。

答案 2 :(得分:0)

我有一个类似的问题,我花了很长时间来调试。我认为Scrapy的某个地方可能存在泄漏,这在大型爬网中变得更加复杂,因为很多人都遇到了这个问题,但我始终无法查明。

无论如何,我通过在一些方法上添加垃圾收集装饰器来解决它。我首先将它们添加到所有方法中,然后查看收集了多少垃圾,然后根据需要将其删除(这可能会使您的Spider速度变慢,因此您只想在需要时使用它们)。

顺便说一句,我建议在添加垃圾回收装饰器之前尝试基于磁盘的请求队列,因为这可以解决您的问题而不必重构任何东西。 Instructions on how to do that can be found in their docs

如果那不能解决您的问题,这是我使用的装饰器:

# garbage collection decorator
def collect_garbage(func):
    def wrapper(*args, **kwargs):
        print(f'\nCollected Garbage before {func.__name__}: {gc.collect()}\n')
        return func(*args, **kwargs)
    return wrapper

希望有帮助!