我有一个使用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问题...
答案 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)
因为tuple
比list
占用的内存少
答案 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
希望有帮助!